我有一个UITableView
,其自定义UITableViewCell
设计为具有自动高度。
行为是我UIViewController
的第一次加载,UITableView
显示带有部分文字的标签。然后,当我滚动到底部然后滚动到顶部,我得到所需的高度和文本外观。
以下是截图:
初步查看视图控制器:
这是滚动底部然后顶部的外观(这是我的实现的正确外观,我删除了一些Lorem文本):
修改1:
代码:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 101 // much heigher than most cells. But no use.
在UI Builder中,UITableViewCell的“行高”设置为“默认”(未选中自定义)
在UI Builder中,UITableView的“行高”设置为“101”(也尝试将其设置为“0”但结果相同。)
答案 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;
}