UITableView用得较多,遇到的情况也较多,单独记录一篇。
0、 cell的选中效果是cell的属性,可以有的有,无的无。
class="brush:objc;gutter:true;">// 自定义cell self.selectionStyle = UITableViewCellSelectionStyleNone; // 取cell cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell的下划线是Table的属性,全部有,或全部无。
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
1、cell下划线左边顶住屏幕左边。
cell.preservesSuperviewLayoutMargins = NO; cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsZero;
后续补充:也可以隐藏掉下划线,自定义LineView,要多宽就多宽,且可以实现不同cell不同下划线样式。
2、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是否有子视图,不然会不断创建
3、加载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]; }
4、导航栏、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 废弃,不过还需要做版本判断。
详见“5、iOS11”
5、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