第一响应者时 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 上的平移手势的主要内容,如果未能解决你的问题,请参考以下文章

使平移手势识别器仅在向下滑动时在桌面视图的顶部进行响应

无法在其父视图之外平移手势较小的 UIView

UIImageView 上的捏合、平移和双击手势

在 iPhone 上的同一 HTML 元素上滑动和平移手势

如何使集合视图响应其自身视图之外的平移手势

处理 UITableView 单元格上的平移手势