我在每个单元格中使用UITableView
并UITextView
增加/减少其高度,以便在键入时适合文本。为此,我通过编写:
UITableView
委托方法中的-textViewDidChange:
[self.tableView beginUpdates];
[self.tableView endUpdates];
一切都很顺利。但是,我注意到打字变慢(iPhone 4具体)。通过将CGFloat
方法应用于-sizeToFit
中的文本,我计算高度的方法只返回UITextView
。我删除了这段代码,没有任何改变,这就是为什么我确定问题出在beginUpdates / beginUpdates方法中。我的问题是,是否有办法以有效的方式实现这一目标?我不想离开那边。
修改
CODE:
-(void)textViewDidChange:(UITextView *)textView
{
[self.tableView beginUpdates];
[self.tableView endUpdates];
[self adjustTextViewHeightToString:textView];
}
- (void)adjustTextViewHeightToString:(UITextView *)textview
{
CGFloat width = textview.frame.size.width;
[textview setScrollEnabled:NO];
[textview sizeToFit];
[textview setFrame:CGRectMake(textview.frame.origin.x, textview.frame.origin.y, width, textview.frame.size.height)];
}
答案 0 :(得分:1)
我认为每次键入或删除某个字符时,您更改textView
高度的问题 - 效率不高,特别是如果您打字速度非常快。首先,除非您要插入,删除或选择行,否则不应该调用beginUpdates & endUpdates
。如文档中所述:beginUpdates
Begin a series of method calls that insert, delete, or select rows and sections of the receiver.
并且您正在做这两件事。
第二:尝试在-(void)textViewDidChange:(UITextView *)textView
检查文本是否适合该行,只有在是,然后增加高度:
创建一个CGRect
变量,最初将CGRectZero
存储在viewWillAppear
中的某处,如下所示:previousRect = CGRectZero;
,然后在委托方法中:
- (void)textViewDidChange:(UITextView *)textView {
UITextPosition* pos = textView.endOfDocument;
CGRect currentRect = [textView caretRectForPosition:pos];
if (currentRect.origin.y > previousRect.origin.y) {
[self adjustTextViewHeightToString:textView];
}
previousRect = currentRect;
}
这不是最有效的方式,但很少会更新表视图。
答案 1 :(得分:0)
- (void)textViewDidChange:(UITextView *)textView
{
UITextPosition *position = textView.endOfDocument;
CGRect currectRect = [textView caretRectForPosition:position];
if(currectRect.origin.x == 0)
{
[self adjustTextViewHeightToString:textView];
}
}
当currentRect.origin.x
等于0表示cursos位于帧的末尾时,在这种情况下,我调用adjustTextViewHeightToString:
方法来调整UITextView
的大小。