iOS:UITableView相关
Posted leonlincq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS:UITableView相关相关的知识,希望对你有一定的参考价值。
UITableView用得较多,遇到的情况也较多,单独记录一篇。
一、零散的技巧
二、取cell
三、导航栏、TableView常见问题相关
一、零散的技巧
1、 cell的选中效果是cell的属性,可以有的有,无的无。
// 自定义cell self.selectionStyle = UITableViewCellSelectionStyleNone; // 取cell cell.selectionStyle = UITableViewCellSelectionStyleNone;
2、cell的下划线是Table的属性,全部有,或全部无。
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
3、cell下划线左边顶住屏幕左边。
cell.preservesSuperviewLayoutMargins = NO; cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsZero;
后续补充:也可以隐藏掉系统的下划线,自定义LineView,要多宽就多宽,且可以实现不同cell不同下划线样式。
4、cell的重用ID,可以用类名
NSStringFromClass([tableCell class])
二、取cell
1、cell初始化的一些区别
1)、TableViewCell
1-1)、没注册
没注册的(一开始会取不到): cell = 从队列取 if(cell取不到) { 创建cell 创建子视图,加tag } cell从tag取子视图,刷新 tag 或 属性
1-2)、注册
注册的(100%取得到): cell = 从队列取(有indexPath的方法) 刷新 tag 或 属性 ( 系统取不到,会走自定义的initWithStyle:reuseIdentifier: if(cell创建成功) { 创建子视图,加tag } )
2)、CollectionViewCell
2-1)、没注册
2-2)、注册
注册的(100%取得到): cell = 从队列取(有indexPath的方法) if(cell取得到) { (判断是否有子视图)创建子视图 } 刷新 tag 或 属性 collectionViewCell 流程有点不同 1、没 TableViewCell 的 initWithStyle:reuseIdentifier: 2、但 每次都能从队列取到 3、所以 需要判断取到的cell是否有子视图,不然会不断创建
2、加载XIB
1)、从多个cell样式的XIB加载。只有1个cell样式,可直接lastObject加载。(先根据不同的ID取,取不到再加载。)
1-1)、获取XIB里的所有对象
NSArray *cellArry = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([MyTableCell class]) owner:self options:nil];
1-2)、读取对应的Cell样式,此时的参数type为枚举,或基本数据类型。
cell = [cellArry objectAtIndex:type];
2)、在 UIView + xxx 的类别文件里,可以添加这个类。方便加载单种Cell样式的XIB。
+ (instancetype)viewFromXib { return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject]; }
三、导航栏、TableView常见问题相关
1、导航栏、TableView
//调整contentInset。
//NO:不调整,按设定的frame、contentInset的显示
//YES:会调整contentInset.top的高,让显示的顶在导航栏下面,【有滑过半透明效果】
self.automaticallyAdjustsScrollViewInsets =NO;
//调整frame
// UIRectEdgeNone //会顶在导航栏下面【没有滑过半透明效果】
// UIRectEdgeTop //对齐原点
// UIRectEdgeLeft //对齐左边
// UIRectEdgeBottom //对齐顶部
// UIRectEdgeRight //对齐右边
// UIRectEdgeAll //对齐所有
self.edgesForExtendedLayout = UIRectEdgeNone;
//导航栏半透明
self.navigationController.navigationBar.translucent = YES;
//隐藏navigationBar(1、它推过的所有的VC共用1个Bar;2、用继承View的hidden属性,隐藏不了!)
self.navigationController.navigationBarHidden=YES;
后续补充:ios11后 automaticallyAdjustsScrollViewInsets 废弃,不过还需要做版本判断。
详见“2、iOS11”
2、iOS11(此处参考简书 “iOS 11 安全区域适配总结”--sonialiu)
1)、TableView 默认开启Cell高度估算,关掉。
[UITableView appearance].estimatedRowHeight = 0; [UITableView appearance].estimatedSectionHeaderHeight = 0; [UITableView appearance].estimatedSectionFooterHeight = 0;
2)、ScrollView新增安全区域。
2-1)、如果之前让TabelView顶住屏幕,然后设置顶部内边距 = 20+44,刚好在导航栏下面的话,
会被系统向下偏移64的 SafeAreaInsets,再加上自己设置的64,就出现下移64问题。
2-2)、同理,没导航栏的时候,也会下移20 -> 状态栏的高度。
2-3)、以前若设置 automaticallyAdjustsScrollViewInsets = YES 让系统自动调整,不会有问题
解决方案:添加下面,相当于 automaticallyAdjustsScrollViewInsets = NO
#ifdef __IPHONE_11_0 if ([tableView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) { [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } #endif
2-4)、contentInsetAdjustmentBehavior 其他类型
UIScrollViewContentInsetAdjustmentScrollableAxes: adjustedContentInset = ( 可滚动方向 ? safeAreaInset + contentInset : contentInset );
UIScrollViewContentInsetAdjustmentNever: adjustedContentInset = contentInset;
UIScrollViewContentInsetAdjustmentAlways: adjustedContentInset = safeAreaInset + contentInset;
UIScrollViewContentInsetAdjustmentAutomatic: (controller里automaticallyAdjustsScrollViewInsets = YES) && (controller被navigation包含) == Always,否则 == Axes
以上是关于iOS:UITableView相关的主要内容,如果未能解决你的问题,请参考以下文章
iOS:不为 UICollectionView 中包含的 UITableView 调用 cellFowRow
UITableView reloadData在iOS 11中重新出现时崩溃
iOS 7下UITableView section index相关崩溃