UITextView在UITableViewCell中顺利自动调整大小

时间:2010-09-20 08:29:01

标签: iphone cocoa-touch ios4

我在UITableViewCell内容视图中有一个UITextView,允许单元格自动调整,以便输入的文本完全显示 - 我想要完成的是一个自动调整单元格,就像本机iOS4联系人应用程序一样,当你输入“注释”时对于联系 - 即当textView的contentSize发生变化时 - 我调用reloadRowsAtIndexPaths并在委托的heightForRowAtIndexPath中为行提供新的高度 - 这可以完成工作,但它不像联系人的应用程序那样漂亮和流畅 - 我几乎可以肯定Apple在该应用程序中使用一些未记录的技巧,使单元格的contentView展开平滑和动画,而无需调用reloadRowsAtIndexPaths。我的问题是你如何建议实现这样的功能?我希望我不会错过任何解释细节。

2 个答案:

答案 0 :(得分:16)

请尝试下面的代码,这将有所帮助。您不必使用任何重装函数,如reloadRowsAtIndexPaths。

// textview delegate

- (void)textViewDidChange:(UITextView *)textView {
    if (contentView.contentSize.height > contentRowHeight) {

    contentRowHeight = contentView.contentSize.height;

    [theTableView beginUpdates];
    [theTableView endUpdates];

    [contentView setFrame:CGRectMake(0, 0, 300.0, contentView.contentSize.height)];
    }
}

// tableview委托

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

    if (indexPath.row == 0)
        height = kTitleRowHeight;
    else 
        height = contentRowHeight;

    return height;
}

答案 1 :(得分:11)

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(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;
}