UITableView beginUpdates / endUpdates使输入速度变慢

时间:2014-06-24 15:15:47

标签: ios objective-c uitableview

我在每个单元格中使用UITableViewUITextView增加/减少其高度,以便在键入时适合文本。为此,我通过编写:

更新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)];
}

2 个答案:

答案 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)

@Alexander Karaberov的回答很安静,帮助了我很多。但我结束了实施:

- (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的大小。