滚动时UITableView奇怪的布局行为更改

时间:2015-03-24 11:26:04

标签: ios uitableview swift

我有一个UITableView,其自定义UITableViewCell设计为具有自动高度。

行为是我UIViewController的第一次加载,UITableView显示带有部分文字的标签。然后,当我滚动到底部然后滚动到顶部,我得到所需的高度和文本外观。

以下是截图:

初步查看视图控制器:

enter image description here

这是滚动底部然后顶部的外观(这是我的实现的正确外观,我删除了一些Lorem文本):

enter image description here

修改1:

代码:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 101 // much heigher than most cells. But no use.

在UI Builder中,UITableViewCell的“行高”设置为“默认”(未选中自定义)

在UI Builder中,UITableView的“行高”设置为“101”(也尝试将其设置为“0”但结果相同。)

2 个答案:

答案 0 :(得分:4)

让自动布局在UITableViewCell上工作是为了确保你有限制来固定所有方面的每个子视图 - 也就是说,每个子视图应该有前导,顶部,尾部和底部约束。

此外,您需要从contentView的顶部到底部进行清晰的约束。这可确保自动布局根据其子视图正确确定contentView的高度。

棘手的部分是,如果您缺少某些约束,Interface Builder通常不会警告您;运行项目时,自动布局根本不会返回正确的高度。例如,它可能为单元格高度返回0,这是您的约束需要更多工作的线索。

如果您在处理自己的项目时遇到问题,请尝试调整约束,直到满足上述条件。

查看链接以获取详细信息:http://www.raywenderlich.com/87975/dynamic-table-view-cell-height-ios-8-swift

答案 1 :(得分:0)

我认为您可以使用heightForRowAtIndexPath方法

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    var heightToReturn : CGFloat = 0

    heightToReturn = StringUtil.findHeightForText("your text", havingWidth: "your label width" , andFont: UIFont.systemFontOfSize("font size"))  + // add some buffer for padding

    if heightToReturn < 101
    {
        heightToReturn = 101
    }
    return heightToReturn
    }

}

并使用此方法计算文本的高度

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font {
CGFloat result = font.pointSize+4;
if (text) {
    CGSize size;

    CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX)
                                      options:NSStringDrawingUsesLineFragmentOrigin
                                   attributes:@{NSFontAttributeName:font}
                                      context:nil];
    size = CGSizeMake(frame.size.width, frame.size.height+1);
    result = MAX(size.height, result); //At least one row
}

return result;

}