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:
但它会节省你很多内存。
在我正在开发的应用程序中,滚动视图中有两个视图控制器。第二个视图控制器 (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:
但它会节省你很多内存。