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