繁体   English   中英

响应者在UISearchBar上平移手势

[英]Pan gesture on UISearchBar while first responder

我有一个非常类似于iOS Maps应用程序的场景-一些内容和一个表格视图,顶部带有一个搜索栏,您可以将其拉到内容上。 我要的是使用户能够在搜索栏上开始平移,而不管它是否处于活动状态。

只要平移未在搜索栏的文本字段内开始,这项工作就可以单独进行。 为了克服这个问题,我在搜索栏顶部放置了一个带有手势识别器的虚拟UIView遮罩,类似于this 但是,一旦我点击并因此searchBar成为第一响应者,遮罩就会转到背景并且不接受触摸(请注意,我没有在遮罩isHidden设置为false )。 返回平移的唯一方法是searchBarContainerView.bringSubview(toFront: theMask) 问题在于,除非searchBar辞职了第一响应者,否则这无效。 我尝试将UIView子类化为容器,并将layoutSubviews更改为:

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

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

层次结构类似于:

  • UIView

    • 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)
}

我最终做了类似的事情,如下。 我将UIView用作遮罩,但这一次它直接在搜索栏视图中:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM