【问题标题】:How to Exclude gesture for subview?如何排除子视图的手势?
【发布时间】:2019-07-28 01:34:24
【问题描述】:

我正在使用一个在图像视图中获取签名的应用程序。我使用 SWRevealViewController 作为侧边菜单。我的应用看起来像这样。

     class CaptureSignature: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIGestureRecognizerDelegate {

我在下面写代码来显示侧边菜单

     override func viewDidLoad() {
            super.viewDidLoad()
    let revealViewController = self.revealViewController()
            menuBtn.addTarget(revealViewController, action: #selector(SWRevealViewController.rightRevealToggle(_:)), for: .touchUpInside)
            revealViewController?.panGestureRecognizer()?.isEnabled = true
    }

现在我的问题是,当我在图像视图上从右向左滑动时,而不是画一条线,侧边菜单正在打开。(因为我在 SWRevealViewController 中启用了 panGesture)。

我不想要的是,当我向右滑动时,我不想在 imageView 上启用滑动手势以显示菜单栏。我写了下面的函数,但它不起作用(即使我在其中放置断点时它也没有进入方法)

       func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {


        if let touchedView = touch.view, touchedView.isDescendant(of: imageView) {
            print("touched in image view")
            return false
        }
        return false

    }

谁能帮帮我。

【问题讨论】:

  • 对不起@MuhammadZohaibEhsan,它不起作用。我想启用 panGesture,但我不想在我的图像视图中启用它
  • 你是在图像视图上绘图吗?
  • 是的,我在图像视图@SAIF 上绘制用户签名
  • 所以禁用图像视图上的手势会产生问题。所以你应该为这个特定的视图控制器禁用revealViewController的平移手势。

标签: ios swift uigesturerecognizer gesture swrevealviewcontroller


【解决方案1】:

您可以使用以下方法忽略特定区域的滑动手势。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool

您仍然可以致电touchesMoved 来绘制您的签名。这是示例代码。

func addSwipeGesture() {
   let leftSwipe = UISwipeGestureRecognizer(target: self, action: 
      #selector(handleSwipes(_:)))
   leftSwipe.delegate = self
   let rightSwipe = UISwipeGestureRecognizer(target: self, action: 
      #selector(handleSwipes(_:)))
   rightSwipe.delegate = self

   leftSwipe.direction = .left
   rightSwipe.direction = .right

   self.view.addGestureRecognizer(leftSwipe)
   self.view.addGestureRecognizer(rightSwipe)
}

@objc func handleSwipes(_ sender:UISwipeGestureRecognizer) {

   if (sender.direction == .left) {
     print("Swipe Left")
   }

   if (sender.direction == .right) {
     print("Swipe Right")
   }
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive 
touch: UITouch) -> Bool {
   return !self.imgView.bounds.contains(touch.location(in: self.imgView))
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
   print("moving")
}

对于上面的代码 sn-p,滑动将被忽略以查看图像,即imgView

【讨论】:

    【解决方案2】:

    您是否尝试过在 UIImageView 上将 isUserInteractionEnabled 设置为 true

    【讨论】:

      【解决方案3】:

      如果您想禁用特定视图的手势。

      self.<yourview>.isUserInteractionEnabled = false
      

      【讨论】:

        【解决方案4】:

        您可以在 Reveal 控制器上调整属性。

        revealController.draggableBorderWidth = # Your Value #
        

        如果触摸开始小于此值,它将限制显示控制器开始平移手势。 就像您的情况一样,如果您的图像视图 x 位置为 50。因此您可以将此属性设置为 40。当用户触摸位置小于 40 时,平移手势将起作用。默认情况下,它的值为 0,这就是平移手势开始的原因从任何地方。

        【讨论】:

          【解决方案5】:

          SWRevealViewController 提供了这个功能。写吧 revealViewController().panGestureRecognizer().isEnabled = false 在控制器中,您要禁用打开菜单的功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-14
            • 1970-01-01
            • 2013-09-29
            • 1970-01-01
            • 2012-10-22
            • 1970-01-01
            相关资源
            最近更新 更多