ios - UIScrollView scrollRectToVisible :animated: not taking rect into account on iOS7

标签 ios iphone objective-c ios7 uiscrollview

[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/

相关文章:

android - 在双摄像头手机中只用一个镜头拍摄照片?

ios - ApplicationIconBadgeNumber 没有在重新安装我的 ipad 应用程序时重置。

ios - 如何在 iOS 9 中使用共享扩展共享笔记数据?

iphone - Xcode Base 国际化不起作用

ios - UIScrollView 内部的 UICollectionView

objective-c - NSTask 在发布版本中仅返回 standardError

android - ionic 推送通知 : Not receiving in IOS

ios - 8 特定应用程序不可用的功能

iphone - 如何搜索字符串数组

ios - 如何仅在应用程序中使用 iOS 推送通知