第一响应者时 UISearchBar 上的平移手势
Posted
技术标签:
【中文标题】第一响应者时 UISearchBar 上的平移手势【英文标题】:Pan gesture on UISearchBar while first responder 【发布时间】:2017-11-02 16:45:21 【问题描述】:我有一个与 ios 地图应用程序非常相似的场景 - 一些内容和一个顶部带有搜索栏的表格视图,您可以将其拉到内容上。我想要的是让用户能够从搜索栏开始平移,无论它是否处于活动状态。
只要平移不在搜索栏的文本字段内开始,就其本身而言,这项工作。为了克服这个问题,我在搜索栏顶部放置了一个带有手势识别器的虚拟UIView
掩码,类似于this。但是,一旦我点击,因此 searchBar 成为第一响应者,掩码进入后台并且不接受触摸(请注意,我没有在掩码上将 isHidden
设置为 false
)。返回平移的唯一方法是searchBarContainerView.bringSubview(toFront: theMask)
。问题是,除非 searchBar 已经让第一响应者辞职,否则这没有效果。我尝试为容器子类化 UIView 并将 layoutSubviews
更改为:
super.layoutSubviews()
if let searchBarMask = self.searchBarMask
bringSubview(toFront: searchBarMask)
但没有效果。有什么建议么?如有必要,我愿意脱离 UIView-mask 模式。
层次结构类似于:
界面视图
ScrollView(内容) ContainerView(上拉的东西)UIView(来自上面的Container View,在一个单独的UIViewController中,命名为XController)
UIView - 搜索占位符 UITableView搜索栏在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)
【问题讨论】:
【参考方案1】:我最终做了类似的事情,如下所示。我放了一个 UIView 作为掩码,但这次是直接在搜索栏视图中:
self.searchBar.addSubview(theMask)
self.searchBar.bringSubview(toFront: theMask)
// add pan gesture recogniser on theMask
我没有任何隐藏/取消隐藏逻辑,而且效果很好。有一些问题,例如您无法从“取消”按钮开始平移并且完全忽略点击搜索字段,但我认为这与正确配置手势识别有很大关系。
【讨论】:
以上是关于第一响应者时 UISearchBar 上的平移手势的主要内容,如果未能解决你的问题,请参考以下文章