book

强制刷新布局

[self layoutIfNeed];

方法调用顺序

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"cellForRowAtIndexPath");
    ...
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%s", __func__);
    return [self.statues[indexPath.row] cellHeigth];
}
  • 打印结果就是调用顺序
2015-06-05 19:23:41.159 08-微博-autolayout-xib[1209:325549]
-[SLStatusTableViewController tableView:heightForRowAtIndexPath:]
2015-06-05 19:23:41.159 08-微博-autolayout-xib[1209:325549]
cellForRowAtIndexPath
  • 但是如果实现了tableView:estimatedHeightForRowAtIndexPath:方法的话,调用顺序就会改变
2015-06-05 19:25:22.092 08-微博-autolayout-xib[1237:334971]
-[SLStatusTableViewController tableView:estimatedHeightForRowAtIndexPath:]
2015-06-05 19:25:22.092 08-微博-autolayout-xib[1237:334971]
cellForRowAtIndexPath
2015-06-05 19:25:22.111 08-微博-autolayout-xib[1237:334971]
-[SLStatusTableViewController tableView:heightForRowAtIndexPath:]

自定义非等高CellHeight

  • xib自定义cell(重点)
    • 在模型中增加一个cellHeight属性,用来存放对应cell的高度
    • 在cell的模型属性set方法中调用[self layoutIfNeed]方法强制布局,然后计算出模型的cellheight属性值
    • 在控制器中实现tableView:estimatedHeightForRowAtIndexPath:方法,返回一个估计高度,比如200
    • 在控制器中实现tableView:heightForRowAtIndexPath:方法,返回cell的真实高度(模型中的cellHeight属性)
  • storyboard自定义cell
  • 代码自定义cell(frame)
  • 代码自定义cell(Autolayout)

UILable的宽度问题

  • 问题:代码创建UILable的时候,设置numberOfLines = 0后,没有效果。
  • 解决:在设置模型的代码中,再设置numberOfLines这个属性,在init方法和awakeFromNib中设置都没用。因为那个时候还没有设置UILable的内容,UILable不知道自己需要多高多宽。
  • 如果设置了lable的宽度,文字过多的时候,会报一个错误。
  • 解决:设置lable每一行文字的最大宽度
// 只执行一次此方法
- (void)awakeFromNib
{
    // 设置label每一行文字的最大宽度
    // 为了保证计算出来的数值 跟 真正显示出来的效果 一致
    self.contentLable.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
}