UIView平移手势与系统手势冲突

时间:2020-06-03 11:45:42

标签: ios swift uiview uigesturerecognizer uipangesturerecognizer

我正在主视图上安装UIPanGestureRecognizer,如下所示:

  panGesture = UIPanGestureRecognizer(target: self, action: #selector(previewPanned(_:))
  panGesture?.minimumNumberOfTouches = 1
  panGesture?.maximumNumberOfTouches = 1               
  view.addGestureRecognizer(panGesture!)

问题在于它可以同时通过Home指示器上的系统滑动手势来识别,以关闭该应用程序。如何避免这种冲突?

编辑:使用以下代码使主页按钮指示器变暗时,会出现问题-

   override var prefersHomeIndicatorAutoHidden: Bool {
      return false
   }

   override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
       return [.bottom, .top]
   }

以上代码在几秒钟后使主页指示灯变暗。然后,您需要滑动两次以关闭应用程序-第一个用于取消显示主屏幕指示灯,第二个用于关闭应用程序。第一次滑动会同时完成,调用我的平移手势识别器并取消原点指示器的显示。我不希望在第一次滑动时调用我的平移手势识别器。

1 个答案:

答案 0 :(得分:3)

如果我对您的理解正确,则您不希望识别器在原位指示器附近工作,因此您有两种选择:

  1. 为此视图专门创建一个视图,并将其底部布局到安全布局指南中。
  2. 实施手势识别器委托方法shouldReceive touch:,然后检查触摸是否在保存范围内:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        let safeAreaFrame = view.bounds.inset(by: view.safeAreaInsets)
        return safeAreaFrame.contains(touch.location(in: view))
    }
    

在以下示例project

中实现了第二种情况