[self.scrollView scrollRectToVisible:rect animated:YES];
有没有人知道为什么这在 iOS6.1 和 iOS7.0.4 上工作得很好总是滚动到已经成为 firstResponder 的 UITextField 无论我发送什么样的 rect 作为参数?
CGRect rect = CGRectMake(0, self.scrollView.frame.size.height - 1, 320, 1);
[self.scrollView scrollRectToVisible:rect animated:YES];
由于 UIScrollView 内部的 UITextField 在 iOS6.1 上已成为第一响应者,因此在显示键盘时,此代码会将 UIScrollView 滚动到其底部,但在 iOS7.0.4 上它会滚动以便 UITextFiled 可见。
正如我所想的那样,iOS7 SDK 中的 UIScrollView 无论如何都会自动滚动到调用 scrollRectToVisible:animated: 时成为其中第一响应者的任何内容。
最佳答案
我怀疑你们中的大多数开发人员都将 scrollRectToVisible:Animated:
与系统键盘通知结合使用,如 Apple Docs here 中所述。 .对我来说,Apple 提供的示例代码不起作用(好吧,只有一半起作用)。
将方法调用放在调度 block 中解决了我的问题:
dispatch_async(dispatch_get_main_queue(), ^{
[self.scrollView scrollRectToVisible:rect animated:YES];
});
我不完全理解为什么这样做,我不确定这是否 100% 安全,但另一方面,感觉比 another answer by Rikkles 中建议的将调用延迟 0.1 秒要安全得多。 .
我(目前)还不是线程问题方面的专家,但似乎在发送 UIKeyboardDidShowNotification
时,任何覆盖滚动行为的隐藏系统方法都已经在主队列中了。因此,如果我们将我们的方法调用也放在主队列中,它将在之后执行,从而产生预期的效果。 (但这只是一个猜测。)
关于ios - UIScrollView scrollRectToVisible :animated: not taking rect into account on iOS7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21434651/