uitableview的常用程度就不用说了,是最强大也是最复杂的UI控件之一,iPhone发展到6代以上,autolayout技术显得越来越重要,甚至是不用不行的程度了;
关于autolayout,很多人用的是storyboard活xib做的,但对于一个讨厌拖控件,讨厌把代码工作变成美图设计工作的菜鸟,还是喜欢纯代码autolayout,用到的有苹果原生的layout约束(这个简直坑爹,代码成倍增加)、VFL语言(这个挺好用,不过比较底层,容易出错)、masonry(目前觉得最好用的纯码autolayout)。。。
uitableviewcell里面的内容用了autolayout后,怎么autolayout cell本身的高度呢??也就是在
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 这个函数里面怎么返回一个autolayout的cell高度值?
关键点就在于怎么拿到cell里面所有内容的frame.height, autolayout的控件如何拿到frame? 有两个方法,利用layoutSubviews 和layoutIfNeeded两个函数可以得到控件autolayout后的frame ,比如想拿到某个Button的frame,执行 [myBtn layoutIfNeeded] 后就可以了。
具体怎么拿到uitableviewcell里面所有的控件的frame:
用UIlabel的preferredMaxLayoutWidth属性和 sizeWithFont: constrainedToSize: lineBreakMode: 这个方法得到自适应uilabel根据文字自适应高度后的frame,至于其他button,uiview等,直接就可以拿到它们的frame了,如下可以得到cell的autolayout后的高度self.totalHeigh:
-(void)layoutSubviews{
[self layoutIfNeeded];
float width=self.frame.size.width-20;
nameLabel.preferredMaxLayoutWidth= width;
sellInfoLabel.preferredMaxLayoutWidth=width;
serviceLabel.preferredMaxLayoutWidth=width;
CGSize labelSize = [nameLabel.text sizeWithFont:nameLabel.font
constrainedToSize:CGSizeMake(width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
CGSize labelSize1 = [sellInfoLabel.text sizeWithFont:sellInfoLabel.font
constrainedToSize:CGSizeMake(width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
CGSize labelSize2 = [serviceLabel.text sizeWithFont:serviceLabel.font
constrainedToSize:CGSizeMake(width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
CGSize labelSize3 = [priceLabel.text sizeWithFont:priceLabel.font
constrainedToSize:CGSizeMake(width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
self.totalHeigh = totalOffset+ labelSize.height+labelSize1.height+labelSize2.height+labelSize3.height; //totalOffset 是几个控件垂直方向的间隙总和。
[super layoutSubviews ];
}
上面的方法是cell里面的方法,如何在uitableview的heightForRowAtIndexPath返回cell的高度呢? 很简单,实例化一个cell对象后设置内容,然后返回cell的totalheigh就可以了
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
int row = (int)[indexPath row];
NSUInteger section = [indexPath section];
if (section == 0) {
if(row == 1){
GoodsDetailCell1 *cell= [[GoodsDetailCell1 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
[cell setCellContent:_goods currPri:_currPriStr]; //这里是设置cell的内容,在cell的这个函数的最后要调用上面提到的layoutSubviews以便得到cell的totalHeigh!!
return cell.totalHeigh;
}
}关于uitableviewcell的autolayout,其实网上还可以搜到其他几个方法,但貌似都说得比较复杂,,,,搞半天没效果,最后自己捣腾,发现其实只要在layoutSubviews拿到控件autolayout后的frame就足够了。