UITableView奇怪的布局行为在滚动上发生变化

我有一个UITableView自定义UITableViewCelldevise有自动高度。

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

这里是截图:

初始查看视图控制器:

在这里输入图像说明

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

在这里输入图像说明

编辑1:

码:

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

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

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

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

而且,你需要从contentView的顶部到底部有一个明确的约束条件。 这确保自动布局根据其子视图正确地确定contentView的高度。

棘手的部分是Interface Builder通常不会警告你,如果你错过了这些限制; 自动布局在运行项目时不会返回正确的高度。 例如,它可能会返回0的单元格高度,这是一个线索,你的约束需要更多的工作。

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

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

我认为你可以使用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; 

}