设置帧后UITextView内容偏移量发生变化

dan*_*nny 5 objective-c uitextview ios

我正在构建一个与消息应用程序非常相似的视图 - 我在页面底部有一个子视图,其中有一个UITextView用户输入并且当用户键入并到达行尾时,文本视图以及包含它的视图应该向上扩展.

我的工作方式是在textViewDidChange:方法中我调用我的布局函数,就是这样

CGFloat textViewWidth = 200;
CGFloat textViewHeight = [self.textView sizeThatFits:CGSizeMake(textViewWidth, 2000)].height;
[self resizeParentWithTextViewSize:CGSizeMake(textViewWidth, textViewHeight)];

// And then the resize parent method eventually calls
textView.frame = CGRectMake(10, 10, textViewWidth, textViewHeight);
Run Code Online (Sandbox Code Playgroud)

问题是,当在行尾输入并且视图扩展时,我最终会contentOffset.y在文本视图中使用10.5之类的任意内容,因此文本全部移动到视图的顶部.奇怪的是,它在每一条线上交替,所以第一次扩展使y内容偏移向上移动,然后在下一行接近零,然后在下一行返回10.5等等(不确定这是否有用或者只是我的价值观的一个奇怪的神器).之后我可以将它设置为零,但它看起来很糟糕,因为有一个短暂的闪光,其中文本具有偏移值,然后它被移回中间.

我已经读过,通常最好使用内容插入来滚动视图而不是更改框架,但我不知道如何做到这一点,因为我也需要更改框架大小.

如果UITextView不发生这种情况,我怎样才能调整大小?我认为我可以设置文本视图不可滚动并解决问题,但我想了解发生了什么.

MG *_*Han 6

问题是UITextView的滚动动画和框架设置动作同时发生.当在行尾输入另一个字符或键入新行字符时,UITextView会在内部将您当前键入的文本滚动显示为可见.但滚动动画不需要因为您正在扩展textview.遗憾的是,我们无法控制textview的内部滚动操作,因此文本很奇怪地滚动到扩展文本视图的顶部.而那个奇怪的滚动也会造成不必要的底部填充.

你可以通过重写UITextView的setContentOffset来避免这种奇怪的动作:动画:像这样.

Objective-C的

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
    [super setContentOffset:contentOffset animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

迅速

override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
    super.setContentOffset(contentOffset, animated: false)
}
Run Code Online (Sandbox Code Playgroud)

此代码避免了自动调整UITextView的不必要的滚动动画大小,您可以自由扩展文本视图的大小.


dan*_*nny 5

设置textView.scrollable = NO让我可以在没有任何奇怪偏移的情况下调整文本视图的大小,这是我能够弄清楚的唯一方法。而且我想这对于常见场景并没有太大的限制,如果您希望文本视图可滚动,您可能不需要即时调整它的大小,因为用户可以随着内容的变化而滚动。