Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在UITextView中滚动到键盘下的插入符号仅在未设置动画时有效_Iphone_Ios_Objective C_Uiscrollview_Uitextview - Fatal编程技术网

Iphone 在UITextView中滚动到键盘下的插入符号仅在未设置动画时有效

Iphone 在UITextView中滚动到键盘下的插入符号仅在未设置动画时有效,iphone,ios,objective-c,uiscrollview,uitextview,Iphone,Ios,Objective C,Uiscrollview,Uitextview,当显示并覆盖键盘时,我试图在UITextView中滚动到插入符号。不幸的是,尽管苹果在Notes应用程序中也做了同样的事情,但它只有在我不设置动画的情况下才能工作。我使用的方法与本文中解释的方法相同 这是代码。它位于一个孤立的项目中,在没有任何其他干扰的情况下对其进行测试。只有一个视图控制器添加了UITextView。我正在iOS 7上测试这个,在模拟器和设备上都是如此 - (void)viewDidLoad { [super viewDidLoad]; [[NSNotifica

当显示并覆盖键盘时,我试图在UITextView中滚动到插入符号。不幸的是,尽管苹果在Notes应用程序中也做了同样的事情,但它只有在我不设置动画的情况下才能工作。我使用的方法与本文中解释的方法相同

这是代码。它位于一个孤立的项目中,在没有任何其他干扰的情况下对其进行测试。只有一个视图控制器添加了UITextView。我正在iOS 7上测试这个,在模拟器和设备上都是如此

- (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];}];由于我是为一本书编写这段代码的,所以我仍然希望有一个正常工作的解决方案,而不是使用变通方法。