20

我有一个UITableview带有多个可重复使用的 TableViewCells。在一个单元格中,我有一个UITextView, 调整自身大小以适应其内容。现在我“只是”必须调整contentViewTableViewCell 的大小,所以我可以阅读 while 文本。我已经尝试过:

cell2.contentView.bounds.size.height = cell2.discriptionTextView.bounds.size.height; 

或者:

cell2.contentView.frame = CGRectMake(0, cell2.discriptionTextView.bounds.origin.y,     
cell2.discriptionTextView.bounds.size.width,     
cell2.discriptionTextView.bounds.size.height); 

在方法中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath 
*)indexPath {}  

但它不会起作用。

有谁知道如何做到这一点?

新代码:

    @implementation AppDetail

    CGFloat height;
    …

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {…

    cell2.TextView.text = self.text;
            [cell2.TextView sizeToFit];
            height = CGRectGetHeight(cell2.TextView.bounds);
     …
    }

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

        if (indexPath.row == 0) {
            return 143;
        }
        if (indexPath.row == 1) {
            return height;
        }

        return 0;
    }
4

8 回答 8

18

您只能在tableView:heightForRowAtIndexPath:委托方法中调整 UITableViewCell 的大小。

您必须估计在加载 tableView 时为每一行调用该方法时文本的大小。

这就是我为解决问题所做的。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
 {
     NSString * yourText = self.myArrayWithTextInIt[indexPath.row]; // or however you are getting the text
     return additionalSpaceNeeded + [self heightForText:yourText];
 }

 -(CGFloat)heightForText:(NSString *)text
 {
   NSInteger MAX_HEIGHT = 2000;
   UITextView * textView = [[UITextView alloc] initWithFrame: CGRectMake(0, 0, WIDTH_OF_TEXTVIEW, MAX_HEIGHT)];
   textView.text = text;
   textView.font = // your font
   [textView sizeToFit];
   return textView.frame.size.height;
  }

编辑

虽然我使用了这个解决方案一段时间,但我发现了一个更优化的解决方案,我建议使用它,因为它不需要分配整个 textView 即可工作,并且可以处理大于 2000 的文本。

-(CGFloat)heightForTextViewRectWithWidth:(CGFloat)width andText:(NSString *)text
{
    UIFont * font = [UIFont systemFontOfSize:12.0f];

    // this returns us the size of the text for a rect but assumes 0, 0 origin
    CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}];

    // so we calculate the area
    CGFloat area = size.height * size.width;

    CGFloat buffer = whateverExtraBufferYouNeed.0f;

    // and then return the new height which is the area divided by the width
    // Basically area = h * w
    // area / width = h
    // for w we use the width of the actual text view
    return floor(area/width) + buffer;
}
于 2013-10-06T16:35:16.783 回答
16

正如@Rob Norback 所说,有一种东西叫做UITableViewAutomaticDimension.

对于 Swift,动态调整 UITableViewCell 内容大小的最简单方法就是添加它。

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
     return UITableViewAutomaticDimension
}
于 2016-03-02T23:46:20.677 回答
14

这是 iOS 7+ 的更新版本,更干净(没有额外的方法)

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UIFont * font = [UIFont systemFontOfSize:15.0f];
        NSString *text = [getYourTextArray objectAtIndex:indexPath.row];
        CGFloat height = [text boundingRectWithSize:CGSizeMake(self.tableView.frame.size.width, maxHeight) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName: font} context:nil].size.height;

        return height + additionalHeightBuffer;
    }
于 2014-12-09T04:01:45.553 回答
8

你需要你实施heightForRowAtIndexPath.

假设要在 textView 中显示的数据存储在 NSArray 中。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 CGFloat cellheight = 30; //assuming that your TextView's origin.y is 30 and TextView is the last UI element in your cell

 NSString *text = (NSString *)[textArray objectAtIndex:indexpath.row];
 UIFont *font = [UIFont systemFontOfSize:14];// The font should be the same as that of your textView
 CGSize constraintSize = CGSizeMake(maxWidth, CGFLOAT_MAX);// maxWidth = max width for the textView

 CGSize size = [text sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

 cellHeight += size.height; //you can also add a cell padding if you want some space below textView

}
于 2013-10-06T16:42:10.320 回答
4

我赞成Jure 的这种解决方案

  • 首先,将 textview 的约束设置为其父视图(在本例中为单元格的 contentView)固定。
  • 禁用textView.scrollEnabled
  • table.rowHeight = UITableViewAutomaticDimension;
    tableView.estimatedRowHeight = 44;
    

    如果最后,您的代码不起作用,请改用它

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        return UITableViewAutomaticDimension;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
        return 44;
    }
    
  • 像这样实现UITextViewDelegate

    - (void)textViewDidChange:(UITextView *)textView {
         CGPoint currentOffset = self.tableView.contentOffset;
         [UIView setAnimationsEnabled:NO];
         [self.tableView beginUpdates];
         [self.tableView endUpdates];
         [UIView setAnimationsEnabled:YES];
         [self.tableView setContentOffset:currentOffset animated:NO];
      }
    
于 2016-10-24T03:00:54.253 回答
3

这个线程已经有一段时间了,但在 iOS 8UITableViewAutomaticDimension中被引入。您必须像滚动视图一样从单元格的顶部到底部设置约束才能使其工作。但在那之后,只需将以下代码添加到viewDidLoad()

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 122.0

确保您估计的高度尽可能接近真实的高度,否则您会得到一些错误的滚动。

于 2016-02-01T19:22:58.820 回答
2

使用 UITableViewAutomaticDimension 将这两个方法添加到 ViewController 应该可以解决问题。当在具有可变长度文本的 UITableViewCell 中嵌入 UITextView 时,它对我有用。

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

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewAutomaticDimension;
}
于 2016-11-11T21:54:03.307 回答
1

对于 UITableViewCell 中的 UILabel 子视图,我仅通过设置标签的约束(使用情节提要,Xcode 8.3.2)来完成标签的自动调整大小。

这是有效的,因为显然标签和单元格的默认行为是 sizeToFit。同样也适用于 UITextView。

于 2017-06-05T22:58:08.040 回答