我发现在iOS 8中使用UITextView
sizeThatFits:
会导致毛刺滚动行为。文本视图不断滚动远离您键入的行。它似乎滚动到视图的顶部,然后再返回。
如果重要,视图将设置为inputAccessoryView
。
通过键盘我输入:1 return 2 return 3 return 4
我输入TextView
前的4
:
在委托方法中,我致电sizeThatFits:
。
- (void)textViewDidChange:(UITextView *)textView {
[textView sizeThatFits:CGSizeMake(100, 100)];
}
TextView
滚动到顶部。输入发生在视图下方。当您键入时,抖动,毛刺的滚动运动到顶部然后回到您的线。输入发生在键盘下方。非常讨厌。
如果我注释掉这一行:
//[textView sizeThatFits:CGSizeMake(100, 100)];
现在当我输入4
时,我们在最后一行输入了很好的,顺畅的输入:
UIScrollView sizeThatFits:
文档声明:
此方法不会调整接收器的大小。
所以我很困惑为什么这会对文本字段的滚动/输入产生任何影响。
有没有办法避免这种毛刺滚动?
如何在不遇到此错误的情况下计算文本视图的“适合高度”?
答案 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故障滚动错误。