Iphone 在UITextView中滚动到键盘下的插入符号仅在未设置动画时有效
当显示并覆盖键盘时,我试图在UITextView中滚动到插入符号。不幸的是,尽管苹果在Notes应用程序中也做了同样的事情,但它只有在我不设置动画的情况下才能工作。我使用的方法与本文中解释的方法相同 这是代码。它位于一个孤立的项目中,在没有任何其他干扰的情况下对其进行测试。只有一个视图控制器添加了UITextView。我正在iOS 7上测试这个,在模拟器和设备上都是如此Iphone 在UITextView中滚动到键盘下的插入符号仅在未设置动画时有效,iphone,ios,objective-c,uiscrollview,uitextview,Iphone,Ios,Objective C,Uiscrollview,Uitextview,当显示并覆盖键盘时,我试图在UITextView中滚动到插入符号。不幸的是,尽管苹果在Notes应用程序中也做了同样的事情,但它只有在我不设置动画的情况下才能工作。我使用的方法与本文中解释的方法相同 这是代码。它位于一个孤立的项目中,在没有任何其他干扰的情况下对其进行测试。只有一个视图控制器添加了UITextView。我正在iOS 7上测试这个,在模拟器和设备上都是如此 - (void)viewDidLoad { [super viewDidLoad]; [[NSNotifica
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedKeyboardDidShowNotification:) name:UIKeyboardDidShowNotification object:nil];
}
- (void)receivedKeyboardDidShowNotification:(NSNotification *)notification {
CGRect keyboardBounds = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
CGFloat keyboardDistanceFromBottomOfScreen = screenHeight - CGRectGetMinY(keyboardBounds);
UITextView *textView = self.textView;
UIEdgeInsets contentInset = textView.contentInset;
contentInset.bottom += keyboardDistanceFromBottomOfScreen;
textView.contentInset = contentInset;
textView.scrollIndicatorInsets = contentInset;
CGRect caretRect = [textView caretRectForPosition:textView.selectedTextRange.end];
[textView scrollRectToVisible:caretRect animated:YES];
}
如果我将最后一行中的动画参数设置为“否”,这将非常有效,但没有动画,当然,这是我不想要的。通过“是”会产生奇怪的行为。大多数情况下,视图不滚动或只滚动几个像素,但有时它会产生我想要的行为,因此结果是随机的
我试图计算插入符号的偏移量,并使用setContentOffset:animated:方法代替scrollRectToVisible:animated:,但结果是一样的。如果“动画”为“否”,则该选项有效。如果为“是”,则会产生相同的奇怪结果
更奇怪的是,在第二种解决方案中,该行上的断点被命中两次,尽管通知只传递了一次。上一行上的断点或我在它不做任何事情之后添加的一行上的断点,只命中了一次用于测试的日志语句。更奇怪的是,在三行上放置日志断点会产生以下结果:
Line before
Buggy line
Line after
Buggy line
因此,第二次击中线路出现故障。看着检查器,看起来所有的局部变量都不在范围内了
我还尝试将这两种解决方案的代码放在另一个方法中,并在延迟后使用performSelector:withObject:afterDelay:调用它,但没有任何更改,即使是长延迟(如1秒)。在第一个解决方案中,虽然没有发生对断点的双重命中
在这一点上,我用尽了解决方案,这对我来说似乎是一个iOS错误,但正如我所说,它在Notes应用程序中工作,所以至少有一个解决方案
编辑:我做了更多的调查,只有当文本视图是第一响应者并且键盘显示时,错误才会发生。我不能说是哪一个负责。如果我从代码而不是键盘通知触发scrollRectToVisible:animated:from,动画工作正常。但是如果我第一次调用显示键盘的[textView becomeFirstResponder],动画会再次中断。这是一个很长的过程,但是你能检查主线程上是否接收到receivedKeyboardDidShowNotification:吗?是的,它在主线程上。我找到了一个非常简单的解决方法。在动画块内调用scrollRectToVisible:animated:解决了以下问题:[UIView animateWithDuration:0.5 animations:^{[textView scrollRectToVisible:caretRect animated:NO];}];由于我是为一本书编写这段代码的,所以我仍然希望有一个正常工作的解决方案,而不是使用变通方法。