引导
“ 本文不适合老司机… ”
本文章将介绍 iOS UI布局 详解,最常使用的三大控件之一 UITableView,将会分成两篇文章完整的讲述UITableView的常用属性方法使用(包括优化方面)及注意点 和 实战开发使用场景案例,文章编写周期会长一些,用到那点实用的东西,会及时补充。
本篇文章主要从【UITableView 属性方法注解
】学习总结。
在「时间 & 知识 」有限内,总结的文章难免有「未全、不足 」的地方,还望各位好友指出,以提高文章质量。
目录:
- 概念
1.UITableView的概念
2.UITableViewCell的概念
3.UITableViewController的概念- UITableView的使用步骤
1.大致个人总结六步- UITableView的常用属性
- UITableViewCell的常用属性
- UITableView的代理方法
- UITableViewController的使用
- UITableViewCell的重用
- UITableViewCell的优化
- UITableView重要属性图解
- UITableView.h 属性&方法
- 期待后续 & About me
概念
UITableView的概念
简化可释义为
"表格视图"
或是"列表视图"
, 且支持选择和编辑的信息
。在iOS开发中做列表数据类型的应用,最常用的做法就是使用UITableView控件。UITbaleView
继承自UIScrollView
,因此支持竖直滚动,而且在UIScrollView
做了性能优化,当然你也可以做到水平滚动,把cell 旋转一下就可以了。
UITableViewCell的概念
简化意思就是
UITableView
的每一行都是一个UITableViewCell
。其中类包含属性和方法用于设置和管理单元格;UITableView
内部有个默认的子控件:contentView
,填充整个UITableViewCell
的父控件。UITableView
的子控件实质都在contentView
上。
UITableViewController的概念
简化意思就是 这个类是一个自带(管理)
tableView
的控制器。在
Xcode
中cmd UITableViewController
点进去,看到1NS_CLASS_AVAILABLE_IOS(2_0) @interface UITableViewController : UIViewController
简化意思就是UITableViewController
是已经遵循了UITableViewDelegate
,UITableViewDataSource
代理的控制器
UITableView使用步骤
下面示例以 tableView
代码自定义不等高Cell
为例:
- 第一步:创建
UITableView
,采用懒加载方式。
|
|
第二步:设置数据源和代理,遵守对应协议。
1@interface LNTableViewAttributeVC ()第三步:设置数据数组,采用懒加载方式加载数据(使用
MJExtension
字典数组转模型数组)。
|
|
- 第四步:创建自定义
Cell
(视图继承UITableViewCell
)。- 1.定义模型类对象。
- 2.定义子控件属性。
- 3.在
initWithStyle:style reuseIdentifier:reuseIdentifier
,添加子控件(设置约束Masonry)。 - 4.
在.layoutSubviews
设置子控件的frame
- 5.模型类对象
set方法setStatus
:设置子控件的数据(赋值)。
|
|
- 第五步:创建自定义模型类(模型继承
NSObject
)。- 1.定义模型属性。
- 2.
提供构造方法(对象方法和类方法)。 - 3.定义对应模型frame属性(注解:
Cell
的动态行高,这里解决方案: 在heightForRowAtIndexPath:
这个方法返回之前就要计算cell的高度,即把cell
子控件的frame
封装到模型中,cellHeight
返回行高(相当于懒加载))。
|
|
- 第六步:实现
DataSource
数据源(必须)
和Delegate
代理(可选)
协议方法创建自定义模型类(模型继承NSObject
)。
|
|
|
|
UITableView基本使用效果图
UITableView常用属性
- 全局设置行row高:
|
|
- 全局设置区头(区尾)高:
|
|
- 设置分割线的样式、铺满和颜色:
|
|
- 设置tableView表格头(尾)视图:
|
|
- 设置table背景视图和颜色:
|
|
- 设置TableView的cell的预设高度(性能优化):
|
|
- 隐藏多余分割线:
|
|
- 设置右侧索引文字和背景颜色:
|
|
UITableViewCell的常用属性
- 设置cell附加样式(比如右侧的箭头):
|
|
- 设置cell右边的指示控件(比如右侧的开关):
|
|
- 设置cell选中样式(StyleNone选中不变灰色):
|
|
- 设置cell的背景控件:
|
|
- 设置cell的背景颜色:
|
|
- 设置cell选中时背景View:
|
|
UITableView的代理方法
- 返回每一行cell的高度:
|
|
- 当选中某一行cell的时候就会调用这个方法:
|
|
- 返回每一组的区头(区尾) 标题 和 控件:
|
|
- 返回每一组的头部(尾部)高度:
|
|
- 返回右侧索引标题:
|
|
- 返回某一行缩进:
|
|
UITableViewController的使用
将控制器设置为
UITableView
的方法和步骤第一步:创建新的类或修改原有的
ViewController
类,继承自UITableViewController
第二步:在
Main.storyboard
中删除自带的UIViewController
控制器,然后往里面拖一个UITableViewController
控制器第三步:修改新拖进来的
TableViewController
控制器的自定义类名为第一步中继承自UITableViewController类的类名第四步:勾选
TableViewController
控制器为程序启动第一个加载的控制器
注意点:
tableVieController
有个tableView
属性,指向一个tableView
。tableView
的dataSource
和delegate
属性指向的就是这个控制器,并且这个控制器已经遵守了UITableViewDataSource
和UITableViewDelegate
。- 每个控制器的内部都有一个
view
属性,在tableVieController
中,view
和tableView
属性指向的是同一个对象(控制器的view就是tableView
)。
UITableViewCell的重用
- 原因:
- iOS设备的内存有限,如果用
UITableView
显示成千上万条数据,就需要成千上万个UITableViewCell
对象的话,那将会耗尽iOS设备的内存。 - 有可能导致显示数据错乱。
- iOS设备的内存有限,如果用
- 原理:
- 当滚动列表时,部分
UITableViewCell
会移出窗口,UITableView
会将窗口外的UITableViewCell
放入一个缓存池中,等待重用 - 当
UITableView
要求dataSource
返回UITableViewCell
时,dataSource
会先查看这个对象池,如果池中有未使用的UITableViewCell
,dataSource
会用新的数据配置这个UITableViewCell
,然后返回给UITableView
,重新显示到窗口中,从而避免创建新的UITableViewCell
对象
- 当滚动列表时,部分
- Cell重用的实现代码
- 方法一:
- 1.定义一个
cell
的重用标识 - 2.根据这个
ID
去缓存池中看有没有可循环利用的cell
- 3.如果缓存池中没有可循环利用的
cell
,自己创建
- 1.定义一个
|
|
- 方法二:
- 1.定义一个
cell
的重用标识。 - 2.根据这个
ID
去缓存池中看有没有可循环利用的cell
。 - 3.如果缓存池中没有会看有没有,根据
ID
这个标识注册对应的cell
类型。 - 4.如果有注册,会根据这个
ID
创建对应的类型的cell
,并且会绑定这个ID
标识,返回这个cell
。
- 1.定义一个
|
|
- 总结:
- 不同类型的Cell共存(重要点是CellID不同)。
UITableViewCell的优化
UITableView 的优化主要从三个方面入手:
1.提前计算并缓存好高度(布局),因为
heightForRowAtIndexPath:
是调用最频繁的方法;2.异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;
3.滑动时按需加载,按照用户滚动的速度去选择加载哪个cell。这个在大量图片展示,网络加载的时候很管用!(
SDWebImage
已经实现异步加载,配合这条性能杠杠的)。
除了上面最主要的三个方面外,还有很多几乎大伙都很熟知的优化点:
- 1.正确使用
reuseIdentifier
来重用Cells
。 - 2.尽量使所有的
view opaque
,包括Cell
自身。 - 3.尽量少用或不用透明图层。
- 4.如果
Cell
内显示的内容来自web
,使用异步加载,缓存请求结果。 - 5.减少
subviews
的数量。 - 6.在
heightForRowAtIndexPath:
中尽量不使用。cellForRowAtIndexPath:
,如果你需要用到它,只用一次然后缓存结果。 - 7.尽量少用
addView
给Cell
动态添加View
,可以初始化时就添加,然后通过hide
来控制是否显示。
- 1.正确使用
- 案例(按需加载):
- 原理:在快速滑动松手后滚动的
cell
个数超过预定的个数,只显示最后出现的cell
的前三个cell
,把这三个cell
的indexPath
存到数组中,在数据源方法里判断如果数组count>0
,且数组不包含当前的indexPath
,那就说明此cell
是在快速滑动中需要隐藏的:
- 原理:在快速滑动松手后滚动的
|
|
相应的,每次开始拖动的时候去清空数组。还有种情况,如果界面上有显示空白cell
的时候突然手动停止滚动呢?
|
|
数据源方法:
|
|
附上:按需加载参考 VVeboTableViewDemo: 这位前辈在tableView优化上做到了极致。
- 总结:
tableView
性能优化的方式有很多,但不是所有的我们都需要。比如不是必需要显示的界面,预先计算行高就是浪费(用户流量)。应适时而定。站在用户体验的角度开发才是好的伐码猿。
UITableView重要属性图解
期待
- 如果在阅读过程中遇到 error || new ideas,希望你能 messages 我,我会及时改正谢谢。
- 点击右上角的 喜欢 和 订阅Rss 按钮,可以收藏本仓库,并在 Demo 更新时收到邮件通知。