2016-06-01 58 views
0

我目前有一个UITableView动态调整大小UITableViewCell对象。这是基于UITextView的动态内容。这就像一个魅力,我可以摆脱我笨拙和不准确的手动执行heightForRowAtIndexPathUITableViewCell - 如何将约束添加到UITextView之前计算heightForRowAtIndex

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

我可以通过将下面的约束约束UITextView的高度:

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

不幸的是,这种情况发生在cellForRowAtIndexPath方法,这恰好的小区的大小后已经确定,所以它看来。要么是这样,要么在确定单元格的大小时不考虑新的约束条件。

如何限制单元格的高度而不必重写heightForRowAtIndexPath方法?

+0

谁投票否决了我的问题 - 您如何在此处发表评论以了解如何改进? – thephatp

回答

1

如果您正在使用自动布局不是没有必要实现heightForRowAtIndexpath:

就在viewDidLoadcellForRowAtIndexpath:

tblView.estimatedRowHeight = 44.0; 
tblView.rowHeight = UITableViewAutomaticDimension; 
+0

有趣的是,我几乎添加了一句“完整性......”表示我已经设置了这些,但并不那么简单。正如我所说,它没有约束就可以正确动态调整大小。但是,当我添加约束条件时,它不符合“小于或等于”的新约束条件。它应该是?是否有其他限制阻止了这种情况的发生? – thephatp

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设备设置不同的单独填充。

+1

这是一个非常有限的解决方案。再次,在我原来的问题中,我问如何做这个_without_覆盖heightForRowAtIndexpath。从性能角度来看,这看起来效率很低。我最终将其更改为UILabel并继续前进(因为您可以用UILabel限制最大行)。 – thephatp

1

您可以尝试从您的IB引用您的高度约束到您的单元格子类,然后在您的单元格子类中更改其属性(基于您为用户提供的配置)。这将消除需要通过编辑引用的约束来手动添加/删除代码的限制。您还可以在自动布局设置中将约束条件设置为活动或非活动的概念。