我在一个大项目中使用Autolayout作为我的新UITableViewCells。
我有一个TableView,其中每行的高度是自动计算的,我不使用委托函数heightForRowAtIndexPath
。
我已经宣布估计行高:
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
我的问题是:在另一个TableViewController上有很多UITableViewCells,我在编程上需要在heightForRowAtIndexPath
中声明单元格的高度。我知道将所有单元格转换为使用唯一解决方案会更好,但在这个项目中有很多不同的单元格,所以我想使用一种解决方法并将动态计算的高度与自动布局和编程计算的行相结合高度。
这可能吗?
答案 0 :(得分:20)
如果您使用的是iOS 8及更高版本,则无需动态计算高度。自动布局将为您完成所有工作。但如果使用低于IOS 8,则需要计算单元格高度。
对于IOS 8:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
并在控制器中添加以下代码:
tableView.estimatedRowHeight = 400.0
tableView.rowHeight = UITableViewAutomaticDimension
estimatedRowHeight
应该是您的单元格的最大高度。
由于
答案 1 :(得分:1)
使用boundingRectWithSize
动态计算内容的高度。
如果您的UILabel
是动态的,则可以使用以下内容:
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
/* Check Content Size and Set Height */
CGRect answerFrame = [YOUR_LABEL.text boundingRectWithSize:CGSizeMake(240.f, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:[UIFont fontWithName:@"" size:14.0f]} context:nil];
CGSize requiredSize = answerFrame.size;
return requiredSize.height;
}
答案 2 :(得分:0)
你可以试试这个。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
int topPadding = cell.yourLabel.frame.origin.x;
int bottomPadding = cell.frame.size.heigth-(topPadding+cell.yourLabel.frame.size.height);
NSString *text = [DescArr objectAtIndex:[indexPath row]];
CGSize maximumSize = CGSizeMake(cell.yourLabel.frame.size.width, 9999);
CGSize expectedSize = [text sizeWithFont:yourCell.yourLabel.font constrainedToSize:maximumSize lineBreakMode:yourCell.yourLabel.lineBreakMode];
return topPadding+expectedSize.height+bottomPadding;
}