我试着仿效iPhone上Apple的邮件应用程序中的“新消息”页面。我用tableview实现了它,并且我已经成功地获得了“To”,“CC”和“Subject”行,但我不确定如何实现页面的实际消息部分。 / p>
我有几个问题。我正在尝试通过在单元格中放置UITextView来实现它(我关闭了文本视图上的滚动条)。通过将文本框架修改为内容的新高度,我可以在文本视图更改时自行调整大小。第一个问题是我还需要为单元格高度本身做这个。由于heightForRowAtIndexPath似乎只在第一次加载行时被调用,所以我无法修改那里的高度。我想我可以在表上调用重载数据,但这似乎每次输入文本时在整个表上都是非常低效的。在用户输入时让表格单元格自动调整大小的最佳方法是什么?我已经找到了很多关于如何在单独的表视图上执行此操作以及如何在初始化时调整表单元格大小的示例,但我找不到任何可以让您同时执行这两个操作的示例。
最后,我希望表格单元格的底部边框不可见。如果您查看邮件应用程序,您会注意到邮件空间底部没有任何行,这意味着您可以继续输入。我总是在我的表视图中有一个(即使我添加页脚),我也无法弄清楚如何摆脱它。 (也许我应该让我的信息主体成为页脚本身?)
答案 0 :(得分:3)
我建议您自己使用UIScrollView而不是UITableView。 UITableView并不是为了支持这样的事情而构建的。
答案 1 :(得分:2)
Mail.app似乎没有使用UITableView。 它看起来像是底部带有UITextView的自定义项(标签和文本字段)。
答案 2 :(得分:1)
您可以尝试我对类似问题的回答......关键是使用
[self.tableView beginUpdates];
[self.tableView endUpdates];
要在不重新加载数据的情况下执行此操作。
首先,当然,您将要创建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;
}