我构建的视图与消息应用程序非常相似 - 我在页面底部有一个子视图,其中包含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);
问题在于,当在行尾输入并且视图展开时,我最终会在文本视图中找到类似10.5的任意contentOffset.y
,因此文本全部移动到顶部视图。奇怪的是,它在每一条线上都是交替的,所以第一次扩展会使y内容偏移向上移动,然后在下一行接近零,然后在下一行返回10.5,等等(不确定这对我的价值观是否有用或只是一个奇怪的工件)。之后我可以将它设置为零,但它看起来很糟糕,因为有一个短暂的闪光,其中文本具有偏移值,然后它会移回到中间。
我已经读过,通常使用内容插件进行滚动视图而不是更改框架会更好,但我不知道怎么做,因为我确实需要更改框架大小也是如此。
如果不发生这种情况,如何调整UITextView
的大小?我认为我可以设置文本视图不可滚动并解决问题,但我想了解发生了什么。
答案 0 :(得分:6)
问题是UITextView的滚动动画和框架设置动作同时发生。 当在行尾输入另一个字符或键入新行字符时,UITextView会在内部将您当前键入的文本滚动显示为可见。但滚动动画不需要因为您正在扩展textview。遗憾的是,我们无法控制textview的内部滚动操作,因此文本很奇怪地滚动到扩展文本视图的顶部。而那个怪异的滚动也会产生不必要的底部填充。
你可以通过重写UITextView的setContentOffset来避免这种奇怪的动作:动画:像这样。
<强>目标C 强>
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
[super setContentOffset:contentOffset animated:NO];
}
<强>夫特强>
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false)
}
此代码避免了自动调整UITextView不必要的滚动动画大小,您可以自由扩展文本视图的大小。
答案 1 :(得分:4)
设置textView.scrollable = NO
让我可以调整文本视图的大小,而不会有任何奇怪的偏移,这是我能够找到的唯一方法。我想这对常见场景没有太多限制,如果你想让文本视图可滚动,你可能不需要动态调整它,因为用户可以滚动内容作为内容变化。
答案 2 :(得分:0)
我遇到了同样的问题:更改Loaded plugins : fastestmirror
Loading mirror speeds from cached hostfile
*base : mirrors.XXXXX.com
*extras: mirrors.XXXXX.com
*updates : mirrors.XXXXX.com
No package php-mysqli available
Error : Nothing to do
的框架以适应其内容会对滚动位置产生副作用。即使UITextView
符合UITextView
。
contentSize
也会滚动
我最终将bounds
设置为scrollEnabled
,如果true
实际上不可滚动,则将内容偏移回滚
UITextView
答案 3 :(得分:0)
实际上,我遇到了同样的问题,发现只有当UITextView有任何Autolayout约束时才会发生这种情况。如果您尝试使用UITextView而不应用任何约束,那么这将不会发生并且将正常工作。但是,当您应用自动布局约束时,它会自动滚动到底部。为了解决这个问题,我只需添加方法
-(void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
self.textView.contentOffset = CGPointZero;
}