使用hidesBarsOnTap和UICollectionView选择

时间:2015-10-15 22:40:23

标签: uinavigationcontroller uicollectionview

我有UICollectionView,其中只有部分单元格可供选择。我想点击任何其他单元格以及屏幕上的任何其他单元格来调用导航栏隐藏/显示行为。

当我设置navigationController.hidesBarsOnTap = true时,barHideOnTapGestureRecognizer会消耗点按,因此用户无法在集合视图中选择项目。如何同时具有条形隐藏行为和正常的集合视图选择行为?

如果我设置了barHideOnTapGestureRecognizer.cancelsTouchesInView = false,那么该项目都会被选中并且栏隐藏切换,但我只想要前者。

我无法在barHideOnTapGestureRecognizer代表中做任何事情,因为Apple明确表示不会这样做。

UICollectionView没有使用手势识别器进行选择,因此无法在其与barHideOnTapGestureRecognizer之间设置依赖关系。

唯一想到的是手动管理集合选择,使用覆盖整个集合的轻击手势识别器(Apple表示不将它们放在单个单元格上),但复制所有集合视图选择似乎很疯狂。我不得不遗漏一些东西。拜托,帮我看看光! :)

3 个答案:

答案 0 :(得分:2)

最后,我向UITapGestureRecognizer添加了UICollectionView,并设置了识别器的委托,只有在触摸时才会从true返回shouldReceiveTouch在一个单元格中,我希望可以选择。

 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    for visibleCell in collectionView.visibleCells() {
        if let selectableCell = visibleCell as? SelectableCell
            where touch.view!.isDescendantOfView(selectableCell) {
                return true
        }
    }
    return false
 }

因此,识别器仅针对我想要选择的单元格中的触摸进行触发,使集合视图中的所有其他触摸都被barHideOnTapGestureRecognizer拾取。

在点按手势识别器的触发操作中,我使用visibleCells上的点击测试来定位所选单元格,然后调用选择。

我必须将navigationController.barHideOnTapGestureRecognizer.cancelsTouchesInView = true设置为更喜欢集合视图上的手势识别器才能进行触摸。

答案 1 :(得分:0)

我遇到了同样的问题。 barHideOnTapGestureRecognizer将拦截单元格上的点击并让它们通过,因此切换栏并且collectionView收到didSelectCell委托消息。 我通过将自己的UITapGestureRecognizer添加到UIView来解决它,并将该视图设置为collectionView的backgroundView。在动作中,手动切换条形。因此,当用户点击一个单元格时,我在后台视图上的识别器将无法看到它。

答案 2 :(得分:0)

这个问题困扰着我,直到我得到以下解决方案为止。

如果可能的话,我们不想用自己的手势处理集合视图事件。这个想法是使用我们自己的手势识别器而不是barHideOnTapGestureRecognizer来切换条形。我们始终可以通过稍后设置navigationController?.hidesBarsOnTap = true来恢复默认识别器。这是详细信息。

  1. 禁用/恢复默认手势
    override func viewDidAppear(_ animated: Bool) {
        navigationController?.hidesBarsOnTap = false
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        navigationController?.hidesBarsOnTap = true
    }
    
  2. 添加自己的手势
    override func viewDidLoad() {
        // other set up
        let gesture = UITapGestureRecognizer(target: self, action: #selector(toggleBarsOnTap(sender:)))
        // need the following otherwise your collection view cannot receive touch event
        gesture.cancelsTouchesInView = false
        view.addGestureRecognizer(gesture)
    }
    
  3. 您的手势处理程序
    @objc private func toggleBarsOnTap(sender: UITapGestureRecognizer) {
        let loc = sender.location(in: yourCollectionView)
        let shouldToggle = YOUR_LOGIC_TO_CHECK_WHETHER_TOGGLE_SHOULD_BE_INVOKED_AT_LOC
        if let isHidden = navigationController?.navigationBar.isHidden, shouldToggle {
            let action = !isHidden
            navigationController?.setNavigationBarHidden(action, animated: true)
            navigationController?.setToolbarHidden(action, animated: true)
        }
    }