iOS 6:UITableView循环利用、UITableViewCell等高/非等高

循环利用

  • tableView显示单组数据的时候,总是显示很多的数据,当然tableView不可能一次加载这么多的数据,那样会浪费很多的内存空间。感觉在手机看来,内存的空间,总是比处理器的资源更加珍贵。这时,就需要用到性能优化了。
  • tableView自身会有一个缓存,将cell绑定标识符来进行识别,并实现内存空间的循环利用。当然一开始缓存中并没有这样的cell,所以需要初始创建若干cell,当此cell不再视野中时,就会被抛弃到缓存中,然后被赋予另一个数据,仍旧是同样的内存空间,并显示出来。
  • 当cell滚动非常快的时候,cell的覆盖并非是按照顺序进行的。
  • dequeueReusableCellWithIdentifier:,去缓存池中查找可循环利用的cell,如果没有的话,就需要自己去创建了。在storyboard设置有identifier的cell,不需要自己创建,默认的回去storyboard里面找有没有这个标识符的cell。
  • reigsterClass
//objc
// 注册某个标识对应的cell类型
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
  • 几个常用的方法

    • select
    • deselect
    • willSelect
    • willDeselect
    • heightForRow
    • viewForHeader
    • heightForHeader
  • tableViewDelegate 协议继承于 scrollViewDelegate,可以自动继承了方法scrollViewDidScroll

cell

  • cell的属性

    • selectionStyle 选中的样式
    • selectedBackgroundView 选中的背景色视图
    • backgroundColor / backgroundView 默认的背景色
    • accessoryType / accessoryView 设置指示器
  • 定义等高的cell

    • xib生成cell
      • registerNib
    • storyboard生成cell
    • 代码生成cell,使用frame来约束,当父控件的frame发生改变的时候,自动调用layoutSubViews: 来对子控件自动布局
    • 代码生成cell,使用autoLayout自动布局,不需要放在layoutSubviews:方法中
    • 技巧:通过设置背景色,来查看约束是否正确,或者用层级调试工具degug
  • 定义非等高的cell

    • 当cell的宽度随着UILable中字数以及UIImageView的有无,来随时调整cell的高度
    • heightForRowAtIndexPath: 方法的调用是在cellForRowAtIndexPath:之前。等程序确定了所有行的高度之后,才会调用返回cell的函数。
    • 在heightForRowAtIndexPath:中调用cellForRowAtIndexPath:。返回cell的函数是拿出显示出来的cell。当cell还没有创建的时候,返回来的是nil。
    • 那么cell的高度到底如何来确定呢
    • 使用estimatedHeightForRowAtIndexPath:方法,当程序知道了估计的高度之后,先调用cellForRowAtIndexPath:,然后再调用heightForRowAtIndexPath:。
    • 由于UITableViewController不知道创建cell内部的子控件细节;在cell的自定义代码中,返回height函数,让外界来调用。
    • 强制布局 [cell layoutIfNeeded],这个很重要。一般情况下,控件的属性布局在tableView显示之前的那一刻去计算,但是要提前获取这些cell的高度,就需要强制去提醒tableView现在就去计算。
  • KVC 键值编码
    • 方法:setValuesForKeysWithDictionary
    • 不是按照顺序匹配,是找到与字典的key同属性名的value,并设置
    • number -> bool 根据类型会有自动转化,有点智能

tips

  • static 修饰局部变量的时候,初始化一次,内存中只有一份。防止一个对象被连续的创建被销毁,但是设置成全局变量又有着代码管理的复杂性弊端。
  • 定义一条线: separator分割线 将UIView的高度设置成1即可。

你可能感兴趣的:(iOS 6:UITableView循环利用、UITableViewCell等高/非等高)