MyException - 我的异常网
当前位置:我的异常网» 操作系统 » iOS:UITableView相干(17-10-10更)

iOS:UITableView相干(17-10-10更)

www.MyException.Cn  网友分享于:2013-10-27  浏览:0次
iOS:UITableView相关(17-10-10更)

UITableView用得较多,遇到的情况也较多,单独记录一篇。

 

一、零散的技巧

二、取cell

三、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([MyCell 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];
}

 

三、cell高度

0、不固定内容的cell,可弄数组、模型存高度,以免每次计算。

  貌似系统计算的(下面的4、5、),耗时都长?复杂的cell滑动不流畅?所以还是能手动就手动咯(下面的2、3、)?

 

1、全部固定高度

  self.tableView.rowHeight = 44;

 

2、自定义cell类方法

+ (CGFloat)getCellHeight
{
    return 44;
}

+ (CGFloat)getCellHeightWithData:(id)data
{
    // 手动计算label的高度
    return 计算高度;
}

  后续补充:对于固定高度,没问题,好用。对于根据Data计算的,根据情况保存计算高度。

 

3、模型(只有属性的特殊类)

 

  后续补充:通过get方法读取。需要才计算(懒加载),可能还要判断是否计算过,否则每次都要计算?

 

4、系统自动计算(iOS6后,使用 UIView 的 类别 UIConstraintBasedLayoutFittingSize 的方法,控件需要全是 Autolayout 约束?)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 取出不带 indexPath 的
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([MyCell class])];
    
    // 填充数据
    //cell.model = model[indexPath.row];
    [cell initData:data[indexPath.row]];
    
    // 计算高度
    // UILayoutFittingCompressedSize 返回最小可能的值
    // UILayoutFittingExpandedSize 返回最大可能的值
    cellHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + 0.5f;
    
    return cellHeight;
}

  后续补充:1、根据情况保存计算高度。  

       2、普通View非Cell,的高度计算也可用,但同样要 Autolayout 约束。

       3、注册cell,一般是取出带indexPath的。不带indexPath一般是在自写cell重用机制的用的。

          但是,注册cell 还可以取出普通的cell样式,不带 indexPath。填充数据,计算高度。

       4、对3、补充,如果是xib可以用 NSBundle。

       5、对3、再补充,可以弄个局部变量,用懒加载获取普通cell,不用每次都获取。

       6、label类,多行,除了  label.numberOfLines = 0。

            好像还需要设置  label.preferredMaxLayoutWidth = SCREEN_WIDTH - 20 ;

 

5、系统自动计算(iOS8后,UITableViewAutomaticDimension,控件需要全是 Autolayout 约束?)

  1)、先给cell高度一个估算值,好让TableView,知道contentSize有多大

tableView.estimatedRowHeight = 80.0f;

  2)、设置为自动计算

tableView.rowHeight = UITableViewAutomaticDimension;

iOS8后,UITableViewAutomaticDimension自动计算,不用实现 heightForRowAtIndexPath 了,不过为了兼容ios8前,可能需要再写、判断

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
	if ( [[[UIDevice currentDevice] systemVersion ] integerValue] >= 8) 
	{
		return UITableViewAutomaticDimension;
	}
	else
	{
		
	}
}

 

 

四、导航栏、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

 

文章评论

亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java程序员必看电影
Java程序员必看电影
程序员必看的十大电影
程序员必看的十大电影
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
那些争议最大的编程观点
那些争议最大的编程观点
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
一个程序员的时间管理
一个程序员的时间管理
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
代码女神横空出世
代码女神横空出世
老程序员的下场
老程序员的下场
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员都该阅读的书
程序员都该阅读的书
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
中美印日四国程序员比较
中美印日四国程序员比较
旅行,写作,编程
旅行,写作,编程
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员的鄙视链
程序员的鄙视链
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员和编码员之间的区别
程序员和编码员之间的区别
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
如何成为一名黑客
如何成为一名黑客
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
每天工作4小时的程序员
每天工作4小时的程序员
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
鲜为人知的编程真相
鲜为人知的编程真相
漫画:程序员的工作
漫画:程序员的工作
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
我的丈夫是个程序员
我的丈夫是个程序员
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
为什么程序员都是夜猫子
为什么程序员都是夜猫子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
10个调试和排错的小建议
10个调试和排错的小建议
总结2014中国互联网十大段子
总结2014中国互联网十大段子
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有