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

时间:2015-08-25 13:32:14

标签: ios uiviewcontroller uiscrollview first-responder

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

my setup

当我从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
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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