【问题标题】:Pan gesture on UISearchBar while first responder第一响应者时 UISearchBar 上的平移手势
【发布时间】: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)
}

【问题讨论】:

    标签: ios swift uigesturerecognizer first-responder


    【解决方案1】:

    我最终做了类似的事情,如下所示。我放了一个 UIView 作为掩码,但这次是直接在搜索栏视图中:

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

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

    【讨论】:

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