iOS:UITableView相关_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > iOS:UITableView相关

iOS:UITableView相关

 2017/10/10 15:43:07  leonlincq  程序员俱乐部  我要评论(0)
  • 摘要:UITableView用得较多,遇到的情况也较多,单独记录一篇。0、cell的选中效果是cell的属性,可以有的有,无的无。//自定义cellself.selectionStyle=UITableViewCellSelectionStyleNone;//取cellcell.selectionStyle=UITableViewCellSelectionStyleNone;cell的下划线是Table的属性,全部有,或全部无。self.tableView
  • 标签:view iOS

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

 

发表评论
用户名: 匿名