在 UITableViewCell 中调整 UITextView 的大小

Posted

技术标签:

【中文标题】在 UITableViewCell 中调整 UITextView 的大小【英文标题】:Resizing UITextView in a UITableViewCell 【发布时间】:2012-05-29 03:47:41 【问题描述】:

我正在尝试调整 UITableViewCell 中的 UITextView 的大小。我也想相应地调整 UITableViewCell 的大小。我的 UITableViewCell 正确调整大小,但 UITextView 没有。它最终只有两条线,而不是正确的大小。当我在 cellForRowAtIndexPath 方法中初始化它时,它看起来像:

        UITextView *notesTextView = [[UITextView alloc] initWithFrame:CGRectMake(83, 12, TEXTVIEW_WIDTH, 22)]; 

        notesTextView.tag = TEXTVIEW_TAG;
        notesTextView.delegate = self;

        [cell.contentView addSubview:notesTextView];

当我尝试在 textView 委托方法中修改它时,我会这样做:

CGSize size = [textView.text sizeWithFont:textView.font constrainedToSize:CGSizeMake(TEXTVIEW_WIDTH, 460) lineBreakMode:UILineBreakModeWordWrap];
NSLog(@"size: %@", NSStringFromCGSize(size)); // has the correct size
if (size.height > self.notesRowHeight) 
    self.notesRowHeight = size.height;
    UITextView *aTextView = (UITextView *)[self.view viewWithTag:TEXTVIEW_TAG];
    CGRect textViewFrame = CGRectMake(aTextView.frame.origin.x, aTextView.frame.origin.y, TEXTVIEW_WIDTH, size.height);
    aTextView.frame = textViewFrame;
    aTextView.contentSize = size;
    [aTextView sizeToFit];
    [aTextView sizeThatFits:size];
    NSLog(@"%@", NSStringFromCGRect(aTextView.frame)); // has the correct height

所以最终发生的是 tableView 正确调整大小,即使 textView 框架的大小正确(例如 83, 12, 197, 120),textView 只有 2 行。它最终不会像我预期的那样占用 UITableViewCell 的大小。

编辑:当我尝试在不是 UITableViewCell 的普通 UIView 中调整 UITextView 的框架时,它工作得很好。所以我不确定在这种情况下有什么不同。

【问题讨论】:

你没有提到你在这方面到底遇到了什么问题,如果你能添加日志详细信息,你得到了什么以及你期望什么,那就太好了。 @rishi 我在我的问题中添加了更多内容。 【参考方案1】:

我找到了答案。我不应该重新加载该行,而只是调用

[tableView beginUpdates];
[tableView endUpdates];

更多信息请访问: UITextView in a UITableViewCell smooth auto-resize shows and hides keyboard on iPad, but works on iPhone

【讨论】:

【参考方案2】:

我找到了解决这个问题的最佳方法。

首先,当然,您需要创建 UITextView 并将其添加到单元格的 contentView 中。我创建了一个名为“cellTextView”的 UITextView 实例变量这是我使用的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView fileNameCellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];

    if (!cellTextView) 
        cellTextView = [[UITextView alloc] initWithFrame:CGRectMake(5.0, 5.0, cell.bounds.size.width - 30.0, cell.bounds.size.height - 10.0)]; // I use these x and y values plus the height value for padding purposes.
    
    [cellTextView setBackgroundColor:[UIColor clearColor]];
    [cellTextView setScrollEnabled:FALSE];
    [cellTextView setFont:[UIFont boldSystemFontOfSize:13.0]];
    [cellTextView setDelegate:self];
    [cellTextView setTextColor:[UIColor blackColor]];
    [cellTextView setContentInset:UIEdgeInsetsZero];
    [cell.contentView addSubview:cellTextView];

    return cell;

然后,创建一个名为 numberOfLines 的 int 变量,并在您的 init 方法中将该变量设置为 1。之后,在您的 textViewDelegate 的 textViewDidChange 方法中,使用以下代码:

- (void)textViewDidChange:(UITextView *)textView

    numberOfLines = (textView.contentSize.height / textView.font.lineHeight) - 1;

    float height = 44.0;
    height += (textView.font.lineHeight * (numberOfLines - 1));

    CGRect textViewFrame = [textView frame];
    textViewFrame.size.height = height - 10.0; //The 10 value is to retrieve the same height padding I inputed earlier when I initialized the UITextView
    [textView setFrame:textViewFrame];

    [self.tableView beginUpdates];
    [self.tableView endUpdates];

    [cellTextView setContentInset:UIEdgeInsetsZero];
    

最后,将此代码粘贴到您的 heightForRowAtIndexPath 方法中:

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

    float height = 44.0;
    if (cellTextView) 
        height += (cellTextView.font.lineHeight * (numberOfLines - 1));
    
    return height;

【讨论】:

【参考方案3】:

我会给你一个不同的看法......

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

       .
       .
       if(_YOUR_ROW_ && _YOUR_SECTION_)
       

           cell.textView.text = Text_Of_TextView;
       
       .
       .





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

   .
   .
   if(_YOUR_ROW_ && _YOUR_SECTION_)
   


       UIFont * FontSize = [UIFont systemFontOfSize:14.0];  
       CGSize textSize = [Text_Of_TextView sizeWithFont:FontSize constrainedToSize:CGSizeMake(Width_OF_textView, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap];

       return textSize.height+PADDING;
   
   .
   .





-(void)textViewDidEndEditing:(UITextView *)textView


    [Text_Of_TextView setText:textView.text];


 CGRect frame = textViewInRow.frame;
        frame.size.height = textViewInRow.contentSize.height;
        textViewInRow.frame = frame;
 [TableView_InView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_YOUR_ROW_ inSection:_YOUR_SECTION_]] withRowAnimation:UITableViewRowAnimationNone];


别忘了为 textview 实现自动调整大小的行为

【讨论】:

【参考方案4】:

这是一个简单的项目,演示了如何使用自动布局来调整从 ios 8 开始的单元格大小。几乎不需要特殊代码。关键点见 readme.md。

project on github

【讨论】:

以上是关于在 UITableViewCell 中调整 UITextView 的大小的主要内容,如果未能解决你的问题,请参考以下文章

滚动后 UITableViewCell 标签发生变化[重复]

在 UITableViewCell 中调整 UITextView 的大小

使用带有原型单元的自定义 UITableViewCell

在 UITableViewCell 中自动调整 UITextField 的大小

仅为 UITableViewCell 的一部分调用 didSelectRowAtIndexPath

如何强制释放 UITableViewCell