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不发生这种情况,我怎样才能调整大小?我认为我可以设置文本视图不可滚动并解决问题,但我想了解发生了什么.
问题是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的不必要的滚动动画大小,您可以自由扩展文本视图的大小.
设置textView.scrollable = NO让我可以在没有任何奇怪偏移的情况下调整文本视图的大小,这是我能够弄清楚的唯一方法。而且我想这对于常见场景并没有太大的限制,如果您希望文本视图可滚动,您可能不需要即时调整它的大小,因为用户可以随着内容的变化而滚动。
| 归档时间: |
|
| 查看次数: |
3609 次 |
| 最近记录: |