UITableViewCell - 如何在计算heightForRowAtIndex之前向UITextView添加约束

时间:2016-06-01 03:09:23

标签: ios objective-c uitableview uitextview

我目前有UITableView动态调整UITableViewCell个对象。这基于UITextView的动态内容。这就像一个魅力,我能够摆脱heightForRowAtIndexPath的笨拙和不准确的手动实现。

现在,我想给用户一个约束最大单元格高度的选项 - 这是他们可以打开和关闭的东西。如果关闭它,我希望一切都能像现在一样工作:没有要求我弄清楚如何正确覆盖heightForRowAtIndexPath,并且单元格增长到内容的大小。但是,如果用户打开此设置,我想为行设置最大高度。

我可以通过添加以下约束来约束UITextView的高度:

[aCell addConstraint:[NSLayoutConstraint constraintWithItem:aCell.details
                                                  attribute:NSLayoutAttributeHeight
                                                  relatedBy:NSLayoutRelationLessThanOrEqual
                                                     toItem:nil
                                                  attribute:NSLayoutAttributeNotAnAttribute
                                                 multiplier:1.0
                                                   constant:[maxHeight floatValue]]];

不幸的是,这种情况发生在cellForRowAtIndexPath方法中,确定了单元格的大小后发生,所以看起来如此。要么是这样,要么在确定细胞大小时不考虑新约束。

如何在不必覆盖heightForRowAtIndexPath方法的情况下约束单元格的高度?

3 个答案:

答案 0 :(得分:1)

如果您使用自动布局,则无需实施heightForRowAtIndexpath:

只需在viewDidLoad中添加此内容,然后在cellForRowAtIndexpath:

中设置所有值和约束
tblView.estimatedRowHeight = 44.0;
tblView.rowHeight = UITableViewAutomaticDimension;

答案 1 :(得分:1)

您可以尝试从IB到细胞子类引用高度约束,然后在细胞子类内更改其属性(基于您为用户提供的配置)。这将消除在代码中手动添加/删除约束的需要,只需编辑引用的约束即可。您还可以将在自动布局设置中将约束设置为活动或非活动的概念组合。

答案 2 :(得分:0)

无需添加约束并陷入困境。只需设置文本视图的顶部,底部,前导和尾部约束,除了高度约束。在视图控制器中添加以下功能。

-(CGSize)getLabelSizeFortext:(NSString *)text forWidth:(float)width WithFont:(UIFont *)font
{
    CGSize constraint = CGSizeMake(width, MAXFLOAT);
    // Get the size of the text given the CGSize we just made as a constraint

    CGRect titleRect = [text boundingRectWithSize:constraint options:(NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingTruncatesLastVisibleLine) attributes:@{NSFontAttributeName:font} context:nil];
    return titleRect.size;

}

然后在tableView:heightForRowAtIndexPath中:你可以这样做,如下所示: -

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    UITextView *myTextView = (UITextView *)[cell viewWithTag:1111]; 
    CGFloat height = [self getLabelSizeFortext:description forWidth:myTextView.frame.size.width WithFont:kFontRobotoRegular(15)].height;
    return height + 5.0;  // 5.0 is the extra padding
}

试试吧。它肯定会奏效。我总是将它用于我的细胞的动态高度。它很容易。如果你有更多的对象,如标签等。然后,在heightForRowAtIndexPath:中返回时,在它们的顶部和底部约束常量中添加它们的高度。不要使用太多的填充,但使用可以为iPhone和iPad设备设置不同的单独填充。