简单地调用UITextView`sizeThatFits:`会导致毛刺滚动/输入行为?

时间:2015-05-29 01:59:16

标签: ios uiscrollview uikit uitextview

我发现在iOS 8中使用UITextView sizeThatFits:会导致毛刺滚动行为。文本视图不断滚动远离您键入的行。它似乎滚动到视图的顶部,然后再返回。

如果重要,视图将设置为inputAccessoryView

通过键盘我输入:1 return 2 return 3 return 4

我输入TextView前的4

TextView right before the bug

在委托方法中,我致电sizeThatFits:

- (void)textViewDidChange:(UITextView *)textView {
    [textView sizeThatFits:CGSizeMake(100, 100)];
}

TextView滚动到顶部。输入发生在视图下方。当您键入时,抖动,毛刺的滚动运动到顶部然后回到您的线。输入发生在键盘下方。非常讨厌。

glitchy typing

如果我注释掉这一行:

//[textView sizeThatFits:CGSizeMake(100, 100)];

现在当我输入4时,我们在最后一行输入了很好的,顺畅的输入:

no glitchy typing

UIScrollView sizeThatFits:文档声明:

  

此方法不会调整接收器的大小。

所以我很困惑为什么这会对文本字段的滚动/输入产生任何影响。

有没有办法避免这种毛刺滚动?

如何在不遇到此错误的情况下计算文本视图的“适合高度”?

2 个答案:

答案 0 :(得分:1)

我有完全相同的问题,我花了5个小时来解决这个令人讨厌的苹果虫,我希望我可以给他们发票! 我最终要做的是创建我原来的UItextView的副本:

self.textViewCopy = [[UITextView alloc] initWithFrame:self.textView.frame];
[self.textViewCopy setFont:self.textView.font];

并且不要将其添加为子视图。

然后在副本上调用sizeThatFits(这会搞砸我们不关心的副本并获取我们需要的信息):

[self.textViewCopy setText:self.textView.text];
CGSize size = [self.textViewCopy sizeThatFits:CGSizeMake(fixedWidth, CGFLOAT_MAX)];

答案 1 :(得分:0)

在UITextView中的文本上使用NSString方法sizeWithFont:constrainedToSize:似乎提供了sizeThatFits:的高效替代方案。

CGSize preferredSize = [textView.text sizeWithFont:textView.font constrainedToSize:CGSizeMake(CGRectGetWidth(textView.bounds), 200.0)];

sizeThatFits:可能正在使用sizeWithFont:constrainedToSize:。无论如何,使用NSString方法时不会重现iOS故障滚动错误。