当第一响应者在 UISearchBar 上平移手势

Pan gesture on UISearchBar while first responder

我有一个与 iOS 地图应用程序非常相似的场景 - 一些内容和一个 table 视图,顶部有一个搜索栏,您可以将其拉到内容上。我想要的是用户能够从搜索栏开始平移,无论它是否处于活动状态。

只要平移不在搜索栏的文本字段内开始,就其本身而言,这项工作。为了克服这个问题,我在搜索栏顶部放置了一个带有手势识别器的虚拟 UIView 面具,类似于 this。但是,一旦我点击,因此 searchBar 成为第一响应者,掩码就会进入后台并且不接受触摸(请注意,我没有在掩码上将 isHidden 设置为 false) .返回平移的唯一方法是 searchBarContainerView.bringSubview(toFront: theMask)。问题是,除非 searchBar 已经辞去了第一响应者,否则这没有任何效果。我尝试为容器子类化 UIView 并将 layoutSubviews 更改为:

super.layoutSubviews()
if let searchBarMask = self.searchBarMask {
   bringSubview(toFront: searchBarMask)
}

但没有效果。有什么建议么?如有必要,我愿意脱离 UIView-mask 模式。

层次结构类似于:

XController 中添加了搜索栏:

override func viewDidLoad() {
    self.controller = UISearchController(nil)
    self.searchPlaceholder.addSubview(self.controller.searchBar)
    ...
    self.mask = UIView(frame: self.controller.searchBar.frame)
    self.searchPlaceholder.insertSubview(self.mask, aboveSubview: self.controller.searchBar)
}

我最后做了类似的事情,如下。我放了一个UIView作为遮罩,不过这次是直接在搜索栏视图中:

self.searchBar.addSubview(theMask)
self.searchBar.bringSubview(toFront: theMask)
// add pan gesture recogniser on theMask

我没有任何 hide/unhide 逻辑,而且效果很好。有一些问题,例如你不能从取消按钮开始平移,点击搜索字段被完全忽略,但我认为这与正确配置手势识别有很大关系。