【问题标题】:Two UIViewControllers inside UIScrollView - resigning first responderUIScrollView 内的两个 UIViewControllers - 辞职第一响应者
【发布时间】:2015-08-25 13:32:13
【问题描述】:

在我正在开发的应用程序中,我在滚动视图中有两个视图控制器。第二个视图控制器 (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
    }
}

【问题讨论】:

  • 想一想和方法并不难,您希望键盘何时关闭?它应该在什么时候解散?
  • 我的滚动视图有 pagingEnabled = true 。当滚动视图从包含 VC 2 的页面捕捉到包含 VC 1 的页面时,我希望键盘消失。我应该补充说我计划添加一个 VC 3,所以我正在寻找一种可行的方法与视图控制器的数量无关。
  • “当滚动视图从包含 VC 2 的页面捕捉到包含 VC 1 的页面时,我希望键盘消失” - 这就是你的答案 - 使用滚动视图委托方法,你的方法将是检测滚动视图何时停止移动并且当前未显示 VC2 以关闭键盘(以及关于如何执行此操作的大量示例)。
  • 谢谢,我做到了,它成功了

标签: ios uiviewcontroller uiscrollview first-responder


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多