浅谈 UITableView

来源:互联网 发布:中巴关系 知乎 编辑:程序博客网 时间:2024/06/08 11:14

UITableView是开发中不可缺少的一个控件,也是比较重要的一个控件,那些基本的初始化和基本属性设置这里就不说了。

一.UITableView的工作原理。

1).tableView上显示的全部数据都依赖于数据源,用过这个控件的都知道,需要遵守它的数据源和代理协议,实现数据源和代理方法。

那么tableView代理方法的执行顺序的怎么样的呢?

UITableView返回有多少组----->  返回每组有多少行 ----->   计算每一行的高度 ---->  再返回指定Cell的界面布局。


2).Cell的复用

用UITableView显示消息数据时,消息行和单元格数量不是一一对应的。在滚动时,系统创建的Cell个数只会比屏幕上显示的多一个。滚动出屏幕外的Cell会移除Window,但是并没有被立即释放,而是放到了一个可复用的对象池中。处于可复用状态。当有新的cell显示到界面上时,系统首先会到复用池中找释放有可重用的cell,如果有就直接拿过来使用,没有才会去创建(显示的是新的内容,视觉上感觉是新创建的,实际上并没有为其开辟新的内存空间)。所以。TableView可以创建多重类型的Cell.复用池中也可以存放多种类型的cell。系统通过定义reuselndentifer作为每个cell的唯一标示来确定即将出现的cell复用是何种类型。这样节省内存,提高效率


3).自定义cell时,重影的产生以及解决(重影的产生是由于自定义cell重用机制造成的)

             *   在创建cell中的子控件时,给他一个标记,在创建前,把旧的先移除,然后在创建。

             **  cell中的子控件随着cell一起创建。

   if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:indetify];
        //<二>label跟随cell创建
        UILabel *firstLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 200, 24)];
        firstLabel.tag = 101;
        [cell addSubview:firstLabel];
    }
 UILabel *firstLabel = (UILabel *)[cell viewWithTag:101];
    firstLabel.text = self.dataArray[indexPath.row][@"name"];

二.UITableView的具体优化

1).尽量使用cell的复用。

使用cell的复用,可以减少内存的开销,没有开辟新的内存空间,也减少了一些计算量。

2).对于不定高的cell,提前将每个cell的高度存入数组,出现一个cell时,直接从数组中拿出确切的高度即可,不用再临时的去计算。对于固定高度的cell和不定高的cell同样适用。

3).涉及到网络请求加载数据和图片时。当UITableView滑动时停止加载数据和图片,等到滑动结束后再进行加载数据,避免卡顿。

1.UITableView继承自UIScrollView,同时也继承了后者的所有方法。

//滑动结束的方法

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView  willDecelerate:(BOOL)decelerate;

//减速结束的方法

- ( void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

2.

if (self.tableView.dragging == NO&& self.tableView.decelerating == NO)  在tableView必须实现的第二个方法中(加载cell的方法中)将数据的渲染写在刚刚的 if 语句中。


4).对于tableView的自定义控件,尤其是UIImageView,尽量减少使用圆角,阴影等layer属性,尽量减少使用alpha来设置透明度,因为设置圆角,透明度的这些layer效果都是在GPU中完成的。


对控件设置cornerRadius后对其进行clip或者mask操作时,会导致offscreenrendering这个也是在GPU中进行的,如果在滑动时,圆角对象太多,回到GPUd 负载会增加。这时可以设置shouldRasterize属性为YES,可以将负载转移给CPU。更彻底的是直接叫UI设计师做成圆角的图,


5).尽量使用懒加载

这个实际上就是在重写某一个对象的getting方法,又叫做延迟加载。原理:程序一开始并不对其进行初始化,而是在用到它的时候才为它开辟一段内存空间来供他使用。

这样做有什么好处呢?

1.不必将创建对象的代码全部都写在ViewDidLoad中,可读性强。

2.每个控件的getting方法,分别负责各自的实例化处理。代码之间独立性强,耦合度低。


6).设置每个cell的opaque属性。

opaque意思是不透明的. 浑浊的.有YES和NO两个结果。

而alpha是透明度

如果控件本身不透明,可以设置opaque为YES。


7).减少返回给cell里面的处理逻辑和时间

把cell里的各个控件整合在一起。实际上就只有一个控件。


8).开发时采用分段加载数据。

设置为分页加载数据,其实也就是上拉刷新和下拉加载。





0 0
原创粉丝点击