当前位置:首页 > 分类124 > 正文

iOS开发验证:取消UITableView的Footer自带的悬停效果

摘要: iOS开发验证:取消UITableView的Footer自带的悬停效果iOS开发验证:取消UI TableView的Footer...
iOS开发验证:取消UITableView的Footer自带的悬停效果

iOS开发验证:取消UITableView的Footer自带的悬停效果

需求:取消UITableView的Footer自带的悬停效果,但不是隐藏,还是要在表格最后显示footer。
1.方案验证背景是:当前VC的表视图是继承UITableViewController的自带的tableView,如果你不想修改样式,它默认的样式就是UITableViewStylePlain。这种情况会有header和footer悬浮的效果。如果你想取消它,那么可以两种方案,实现scroll代理,修改style样式。
方案1,实现如下代理即可:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {    if (scrollView == self.tableView)    {        UITableView *tableview = (UITableView *)scrollView;        CGFloat sectionHeaderHeight = 64;        CGFloat sectionFooterHeight = 44;        CGFloat offsetY = tableview.contentOffset.y;        if (offsetY >= 0 && offsetY <= sectionHeaderHeight)        {            tableview.contentInset = UIEdgeInsetsMake(-offsetY, 0, -sectionFooterHeight, 0);                    }else if (offsetY >= sectionHeaderHeight && offsetY <= tableview.contentSize.height - tableview.frame.size.height - sectionFooterHeight)        {            tableview.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, -sectionFooterHeight, 0);        }else if (offsetY >= tableview.contentSize.height - tableview.frame.size.height - sectionFooterHeight && offsetY <= tableview.contentSize.height - tableview.frame.size.height)        {            tableview.contentInset = UIEdgeInsetsMake(-offsetY, 0, -(tableview.contentSize.height - tableview.frame.size.height - sectionFooterHeight), 0);        }    }}
2. 备份方案对于继承UITableViewController,如果想更改tableview样式,请重写初始化方法:
- (instancetype)initWithStyle:(UITableViewStyle)style {    return [super initWithStyle: UITableViewStyleGrouped];}
另外,可以去掉头部间距
// 隐藏UITableViewStyleGrouped上边多余的间隔self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)];
3. 提醒每个人的情况可能不太一样,笔者这里的验证结果可能只针对特定情况,读者自行根据实际情况参考和判断。也可以在评论区留言写下你工程背景和验证情况。
4. 推荐阅读关于tableView两种样式的区别:https://www.jianshu.com/p/764ed5aa46cfUITableViewStyleGrouped模式下烦人的多余间距 https://www.jianshu.com/p/34abcadf0bb8

iOS开发必会技能 - RxSwift 系列四、UITableView的使用

前面我们讲了最基础的RxSwift知识点。
本来应该继续讲知识点。但是为了大家学的不那么枯燥,我们现在开始讲平时开发经常用到的一些控件。在期间穿插一些知识点。
今天我们将的是 iOS开发中最常用的UITableview控件。
一、基本用法
先上代码:
import UIKitimport RxSwiftimport RxCocoa class ViewController: UIViewController {  var tableView:UITableView!  let disposeBag = DisposeBag()  override func viewDidLoad() { super.viewDidLoad()  //创建表格视图 self.tableView = UITableView(frame: self.view.frame, style:.plain) //创建一个重用的单元格 self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") self.view.addSubview(self.tableView!)  //初始化数据 let items = Observable.just([ "UILable的用法", "UIText的用法", "UIButton的用法" ])  //设置单元格数据(其实就是对 cellForRowAt 的封装) items.bind(to: tableView.rx.items) { (tableView, row, element) in let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")! cell.textLabel?.text = "\(row):\(element)" return cell } .disposed(by: disposeBag) }}
cell选中事件
//获取选中项的索引tableView.rx.itemSelected.subscribe(onNext: { indexPath in print("选中项的indexPath为:\(indexPath)")}).disposed(by: disposeBag) //获取选中项的内容tableView.rx.modelSelected(String.self).subscribe(onNext: { item in print("选中项的标题为:\(item)")}).disposed(by: disposeBag)
如果需要再block里调用self方法,在 in 前面的 变量前加上 [weak self] :
tableView.rx.itemSelected.subscribe(onNext: { [weak self] indexPath in
self?.showMessage("选中项的indexPath为:\(indexPath)")
}).disposed(by: disposeBag)
cell取消选中事件
//获取被取消选中项的索引tableView.rx.itemDeselected.subscribe(onNext: { [weak self] indexPath in self?.showMessage("被取消选中项的indexPath为:\(indexPath)")}).disposed(by: disposeBag) //获取被取消选中项的内容tableView.rx.modelDeselected(String.self).subscribe(onNext: {[weak self] item in self?.showMessage("被取消选中项的的标题为:\(item)")}).disposed(by: disposeBag)
cell将要显示出来的事件
//获取选中项的索引tableView.rx.willDisplayCell.subscribe(onNext: { cell, indexPath in print("将要显示单元格indexPath为:\(indexPath)") print("将要显示单元格cell为:\(cell)\n") }).disposed(by: disposeBag)
RxDataSources
RxDataSource 的本质就是使用 RxSwift 对 UITableView 和 UICollectionView 的数据源做了一层包装。使用它可以大大减少我们的工作量。
如果我们的 tableview 需要显示多个 section、或者更加复杂的编辑功能时,可以借助 RxDataSource 这个第三方库帮我们完成。
引入项目:
CocoaPods:pod 'RxDataSources', '~> 3.0'Carthage:github "RxSwiftCommunity/RxDataSources" ~> 3.0
RxDataSources 是以 section 来做为数据结构的。所以不管我们的 tableView是单分区还是多分区,在使用 RxDataSources 的过程中,都需要返回一个 section 的数组。
我们要显示下面的内容:
单分区的 TableView
一:使用自带的Section
import UIKitimport RxSwiftimport RxCocoaimport RxDataSources class ViewController: UIViewController { var tableView:UITableView! let disposeBag = DisposeBag()  override func viewDidLoad() { super.viewDidLoad()  //创建表格视图 self.tableView = UITableView(frame: self.view.frame, style:.plain) //创建一个重用的单元格 self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") self.view.addSubview(self.tableView!)  //初始化数据 let items = Observable.just([ SectionModel(model: "", items: [ "UILable的用法", "UIText的用法", "UIButton的用法" ]) ])  //创建数据源 let dataSource = RxTableViewSectionedReloadDataSource <SectionModel<String, String>>(configureCell: { (dataSource, tv, indexPath, element) in let cell = tv.dequeueReusableCell(withIdentifier: "Cell")! cell.textLabel?.text = "\(indexPath.row):\(element)" return cell })  //绑定单元格数据 items.bind(to: tableView.rx.items(dataSource: dataSource)) .disposed(by: disposeBag) }}
二:使用自定义的Section
import UIKitimport RxSwiftimport RxCocoaimport RxDataSources class ViewController: UIViewController {  var tableView:UITableView! let disposeBag = DisposeBag()  override func viewDidLoad() { super.viewDidLoad()  //创建表格视图 self.tableView = UITableView(frame: self.view.frame, style:.plain) //创建一个重用的单元格 self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") self.view.addSubview(self.tableView!)  //初始化数据 let sections = Observable.just([ MySection(header: "", items: [ "UILable的用法", "UIText的用法", "UIButton的用法" ]) ])  //创建数据源 let dataSource = RxTableViewSectionedAnimatedDataSource<MySection>( //设置单元格 configureCell: { ds, tv, ip, item in let cell = tv.dequeueReusableCell(withIdentifier: "Cell") ?? UITableViewCell(style: .default, reuseIdentifier: "Cell") cell.textLabel?.text = "\(ip.row):\(item)"  return cell })  //绑定单元格数据 sections.bind(to: tableView.rx.items(dataSource: dataSource)) .disposed(by: disposeBag) }} //自定义Sectionstruct MySection { var header: String var items: [Item]} extension MySection : AnimatableSectionModelType { typealias Item = String  var identity: String { return header }  init(original: MySection, items: [Item]) { self = original self.items = items }}
多分区的UITableView
一:使用自带的Section
import UIKitimport RxSwiftimport RxCocoaimport RxDataSources class ViewController: UIViewController {  var tableView:UITableView!  let disposeBag = DisposeBag()  override func viewDidLoad() { super.viewDidLoad()  //创建表格视图 self.tableView = UITableView(frame: self.view.frame, style:.plain) //创建一个重用的单元格 self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") self.view.addSubview(self.tableView!)  //初始化数据 let items = Observable.just([ SectionModel(model: "基本控件", items: [ "UILable的用法", "UIText的用法", "UIButton的用法" ]), SectionModel(model: "高级控件", items: [ "UITableView的用法", "UICollectionViews的用法" ]) ])  //创建数据源 let dataSource = RxTableViewSectionedReloadDataSource <SectionModel<String, String>>(configureCell: { (dataSource, tv, indexPath, element) in let cell = tv.dequeueReusableCell(withIdentifier: "Cell")! cell.textLabel?.text = "\(indexPath.row):\(element)" return cell })  //设置分区头标题 dataSource.titleForHeaderInSection = { ds, index in return ds.sectionModels[index].model }  //设置分区尾标题 //dataSource.titleForFooterInSection = { ds, index in // return "footer" //}  //绑定单元格数据 items .bind(to: tableView.rx.items(dataSource: dataSource)) .disposed(by: disposeBag) }}
二:使用自定义的Section
import UIKitimport RxSwiftimport RxCocoaimport RxDataSources class ViewController: UIViewController {  var tableView:UITableView!  let disposeBag = DisposeBag()  override func viewDidLoad() { super.viewDidLoad()  //创建表格视图 self.tableView = UITableView(frame: self.view.frame, style:.plain) //创建一个重用的单元格 self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") self.view.addSubview(self.tableView!)  //初始化数据 let sections = Observable.just([ MySection(header: "基本控件", items: [ "UILable的用法", "UIText的用法", "UIButton的用法" ]), MySection(header: "高级控件", items: [ "UITableView的用法", "UICollectionViews的用法" ]) ])  //创建数据源 let dataSource = RxTableViewSectionedAnimatedDataSource<MySection>( //设置单元格 configureCell: { ds, tv, ip, item in let cell = tv.dequeueReusableCell(withIdentifier: "Cell") ?? UITableViewCell(style: .default, reuseIdentifier: "Cell") cell.textLabel?.text = "\(ip.row):\(item)"  return cell }, //设置分区头标题 titleForHeaderInSection: { ds, index in return ds.sectionModels[index].header } )  //绑定单元格数据 sections .bind(to: tableView.rx.items(dataSource: dataSource)) .disposed(by: disposeBag) }} //自定义Sectionstruct MySection { var header: String var items: [Item]} extension MySection : AnimatableSectionModelType { typealias Item = String  var identity: String { return header }  init(original: MySection, items: [Item]) { self = original self.items = items }}

发表评论