UITableviewCell基于标签的自动调整不起作用

时间:2015-04-30 00:35:26

标签: objective-c uitableview autolayout

UITableview单元格正在返回与其文本无关的高度。

我一直在处理一个相当恼人的错误,其中xcode为单元格返回不正确的高度,并且通常只是单元格中非常不一致的元素的返回像素高度。

我认为我可以实施以下方法来清理事情,但事实证明它们只会让事情变得更糟。

google doc中的第一个图像就是我使用这些方法时单元格的样子。请告诉我你必须解决的任何想法。问题的关键是我在谷歌文档的第二张图片中展示的一个特例。

特殊情况背后的原因以及对其发生原因的深入讨论是在谷歌文档中。这是google doc链接: https://docs.google.com/document/d/1tT43nE-1Wq8leRIaoQ29S0aQhZUWP88kIX3WlG_RcOg/edit?usp=sharing

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section==0)  { //postcell
    return 500.0; //TODO add some autolayout stuff for this case...
} else  { //comment cell
    UIFont * font=[UIFont fontWithName:@"Helvetica Neue" size:13.0];
    NSIndexPath *adjustedIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section-1];
    BRComment *comment = [self.commentsController objectAtIndexPath:adjustedIndexPath];
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;

    //CommentCell * commentCell=(CommentCell *)[self.tableView cellForRowAtIndexPath:indexPath];
    CGSize labelHeight = [self heigtForCellwithString:comment.body andLabelWidth:screenWidth-78.0 withFont:font];
    return labelHeight.height; // the return height + your other view height
}
}

 -(CGSize)heigtForCellwithString:(NSString *)stringValue andLabelWidth:(CGFloat)labelWidth withFont:(UIFont *)font{
CGSize constraint = CGSizeMake(labelWidth,9999); // Replace 300 with your label width //TODO replace
NSDictionary *attributes = @{NSFontAttributeName: font};
CGRect rect = [stringValue boundingRectWithSize:constraint
                                        options:         (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                     attributes:attributes
                                        context:nil];
return rect.size;

}

1 个答案:

答案 0 :(得分:0)

iOS 8向UITableViewAutomaticDimension引入了超级便捷的UITableView const。要自动调整单元格大小,只需从UITableViewAutomaticDimension-tableView:heightForRowAtIndexPath:返回-tableView:estimatedHeightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewAutomaticDimension;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewAutomaticDimension;
}

Voila,你的细胞大小应该正确。请注意,如果您需要使用这些内容,还会考虑单元格layoutMarginsindentationWidth / indentationLevel