如何在不指定估计行高的情况下使用iOS自动调整大小单元?

时间:2015-03-01 05:14:29

标签: ios uitableview cocoa-touch ios8 uikit

我想利用自动布局在iOS 8中自动处理我的单元格高度,但我讨厌估计的行高度如何使滚动(跳跃,滚动位置无法预测等)。

有没有办法不使用估算,以便表格视图预先计算所有行高度,就像它在iOS 7之前那样(不是太多单元格,所以不是性能问题),而是使用iOS 8自动计算高度?

3 个答案:

答案 0 :(得分:3)

编辑:

如果不使用此属性,则无法使用动态大小调整。 estimatedRowHeight告诉系统使用动态大小,假设您在单元格中使用了自动布局。

观看WWDC 2014视频226。

//

非常简单 - 在Storyboard中创建原型单元格,向superview top / bottom(又称单元格内容视图)添加约束,这意味着您的子视图具有顶部/底部约束,这些约束将会推动"推送"必要时的细胞大小。

使TableView和Cell高度都设置为Default。如果这个问题(自动布局需要的高度超过默认的44分),请确保在代码中执行此操作: tableView.rowHeight = UITableViewAutomaticDimension 不要忘记设置estimatedRowHeight以告诉系统您想要启用动态大小调整。

答案 1 :(得分:1)

自动调整大小要求您提供估计的行高,但您可以使用自动布局预先计算行高。

要做到这一点,你需要一个“虚拟”单元格,其中填充了你想要计算的单元格的数据。然后您可以使用自动布局为您完成工作:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static YourCell *dummy = nil;
    static NSLayoutConstraint *widthConstraint = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        UINib *nib = [UINib nibWithNibName:@"YourCell" bundle:nil];
        dummy = [[nib instantiateWithOwner:nil options:nil] firstObject];
        widthConstraint = [NSLayoutConstraint 
constraintWithItem:dummy.contentView attribute:NSLayoutAttributeWidth 
relatedBy:NSLayoutRelationEqual toItem:nil attribute:
NSLayoutAttributeWidth multiplier:1.0 constant:320.0]; 
        widthConstraint.priority = 750; //Good idea to lower priority of this constraint so it doesn't interfere with whatever table view sets internally
        [dummy addConstraint:widthConstraint];
    });

    //account for current table view width
    widthConstraint.constant = tableView.bounds.width; 

    //...
    //Configure dummy cell here
    //...

    CGSize size = [dummy systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    return size.height;
}

答案 2 :(得分:1)

你可以使用

 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath  

_activityTable.estimatedRowHeight = [CompanyEventCell cellHeight];