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

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

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

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

我输入4之前的TextView

错误之前的TextView

在委托方法中,我调用sizeThatFits: .

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

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

毛病的打字

如果我注释掉这条线:

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

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

没有毛病的打字

UIScrollView sizeThatFits: docs状态:

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

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

有什么方法可以避免这种毛刺滚动吗?

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

我有完全相同的问题,我花了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)]; 

使用NSString方法sizeWithFont:constrainedToSize:对UITextView中的文本似乎提供了sizeThatFits:替代sizeThatFits:

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

sizeThatFits:有可能使用sizeWithFont:constrainedToSize:引擎盖下。 无论如何,使用NSString方法时不会再现iOS故障滚动错误。