UIScrollView scrollRectToVisible:动画:在iOS7上不考虑rect

Hen*_*olm 9 iphone objective-c uiscrollview ios ios7

[self.scrollView scrollRectToVisible:rect animated:YES];
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么这在iOS6.1和iOS7.0上完全正常工作总是滚动到已成为firstResponder的UITextField,无论我作为参数发送什么样的矩形?

CGRect rect = CGRectMake(0, self.scrollView.frame.size.height - 1, 320, 1);
[self.scrollView scrollRectToVisible:rect animated:YES];
Run Code Online (Sandbox Code Playgroud)

由于UIScrollView内部的UITextField已经成为iOS6.1上的第一响应者,但是在iOS7.0.4上滚动它以便UITextFiled可见,此代码将在显示键盘时将UIScrollView滚动到底部.

正如我想的那样,iOS7 SDK中的UIScrollView无论如何,当scrollRectToVisible:animated:被调用时,自动滚动到内部的第一个响应者.

Mis*_*cha 10

我怀疑大多数开发人员正在使用scrollRectToVisible:Animated:系统键盘通知,如Apple Docs中所述.对我来说,Apple提供的示例代码不起作用(好吧,只有一半是这样的).

将方法调用放在调度块中为我解决了问题:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.scrollView scrollRectToVisible:rect animated:YES];
});
Run Code Online (Sandbox Code Playgroud)

我不完全理解为什么这样做有效,而且我不确定这是否100%安全,但另一方面它感觉比仅仅延迟0.1秒的呼叫更安全,正如Rikkles另一个回答中所建议的那样.

我不是线程问题的专家(但是)但似乎任何隐藏的系统方法都覆盖滚动行为已经在主队列UIKeyboardDidShowNotification发送时已经存在.因此,如果我们将方法调用放在主队列上,它将在之后执行,从而产生所需的效果.(但这只是猜测.)


Rik*_*les 9

在iOS 8(可能还有7)上,操作系统在runloop操作的尾端自动滚动到UITextField,就在它返回到监听用户输入之前.在OS自动滚动之后和用户输入之前,我没有找到任何方法进入.既UIKeyboardWillShowNotification不会也UIKeyboardDidShowNotification不会挂钩.

然而,总是有效的是延迟后执行选择器的好老把戏.只需将滚动代码放在自己的方法中,然后调用该方法:

- (void)keyboardDidShow:(NSNotification*)aNotification {
  // ... all code to choose the view you want ...
  [self performSelector:@selector(moveToView:) withObject:visibleView afterDelay:0.1];
}

- (void)moveToView:(UIView *)aView {
  [self.scView scrollRectToVisible:aView.frame animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

这将在操作系统自动滚动后运行,而你是金色的.


Anc*_*inu 4

我以前遇到过这个问题。这不是一件容易的事,但肯定很无聊。

这是因为我将 contentSize 设置为 0 (因为你不希望它滚动)。并且您应该至少设置 1。

[scrollView setContentSize: CGSizeMake(1, self.view.frame.size.height)];
Run Code Online (Sandbox Code Playgroud)

我希望这是解决方案;)