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 8 UITableView,静态单元格不可见

iOS 7下UITableView section index相关崩溃

iOS 在 UITableView 中显示来自 ALAsset 的图像

iOS相关的UI最新知识点总结