UIScrollView 内的两个 UIViewControllers - 辞职第一响应者

Two UIViewControllers inside UIScrollView - resigning first responder

在我正在开发的应用程序中,滚动视图中有两个视图控制器。第二个视图控制器 (VC2) 包含一个文本视图。您可以在下图中看到设置:

!

当我从 VC2 滚动到 VC1 时,键盘仍然存在并覆盖了 VC1 的内容。我设法通过使滚动视图成为 scrollViewDidScroll 事件的第一响应者来解决问题。这可行,但它会导致键盘甚至在部分滚动时消失,这可能会让用户感到厌烦。我也可以通过检查内容偏移来解决这个问题,但它让我觉得过于复杂而且一点也不优雅。有更好的方法吗?

编辑:

正如 Chonch 和 latenitecoder 所建议的,我检测到页面更改。我将代码从 Detecting UIScrollView page change 修改为 swift。这是:

var previousPage = 0

func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    let pageWidth = scrollView.frame.size.width
    let fractionalPage = scrollView.contentOffset.x / pageWidth
    let page = Int(round(fractionalPage))
    if (previousPage != page) {
        // Page has changed, do your thing!
        self.becomeFirstResponder()
        // Finally, update previous page
        previousPage = page
    }
}

您可以将UIScrollView的pagingEnabled属性设置为YES,只在分页结束时调用resignFirstResponder给UITextView,结果页面为VC1。只要当前页面仍然是 VC2,您就不会调用 resignFirstResponder,并且键盘仍然显示。

但是,请注意,一旦用户开始滚动(如您所描述的是您的当前状态),隐藏键盘实际上可能是个好主意。也许你应该这样,当分页结束时,检查当前页面是否为 VC2,如果是,则在 UITextView 上调用 becomeFirstResponder 以再次显示键盘。

我建议将 UIPageViewController 用于水平滚动控制器。然后你可以在它的委托方法中做同样的动作 - (void)pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted: 但它会节省你很多内存。