【问题标题】:UIView pan Gesture conflict with system gestureUIView pan 手势与系统手势冲突
【发布时间】:2020-09-22 02:33:10
【问题描述】:

我正在主视图上安装一个 UIPanGestureRecognizer 如下:

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

问题在于它会与主页指示器上的系统滑动手势同时识别以关闭应用程序。如何避免这种冲突?

编辑:当我使用以下代码调暗主页按钮指示器时出现问题 -

   override var prefersHomeIndicatorAutoHidden: Bool {
      return false
   }

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

上面的代码在几秒钟后使主页指示灯变暗。然后你需要滑动两次来关闭应用程序——第一次取消主页指示器,第二次关闭应用程序。第一次滑动两者兼而有之,调用我的平移手势识别器以及取消主页指示器。我不希望在第一次滑动时调用我的平移手势识别器。

【问题讨论】:

  • 问题是一旦你离开安全区域就没什么可做的了,这就是为什么它被这样划分,这样你就不会遇到任何意外的行为。不过,您可以做的是检查何时使用 applicationWillResignActive() 轻扫主页按钮,并在离开前撤消您的平移操作。
  • 主页按钮已经被我调暗了。如果它没有变暗,它总是优先并且没有问题。但是一旦它变暗,它需要一个边缘滑动才能首先取消它。然后再次边缘滑动以关闭应用程序。这是第一次边缘滑动以取消导致冲突的主页按钮。

标签: ios swift uiview uigesturerecognizer uipangesturerecognizer


【解决方案1】:

如果我理解正确,你不希望你的识别器在 Home 指示器附近工作,所以你有两个选择:

  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中实现

【讨论】:

  • @DeepakSharma 在哪些情况下?在我的测试项目中,它似乎一直在工作。您可以添加日志以查看此方法的结果何时返回 true,何时不应该返回 true
  • 我更新了问题的详细信息。确保将这两种方法放在测试项目中并重试。
  • @DeepakSharma 我添加了一个示例项目的链接,它按预期工作。请查看以了解您的情况有何不同
  • 我在初始化 panGesture 时忘记设置委托。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多