1

我提出了一个视图控制器,其中有一个子视图。我在子视图上添加了滑动手势。没有调用滑动手势。取而代之的是,呈现的视图控制器试图解除自身,即下降。如何覆盖滑动手势以被子视图而不是超级视图识别。当我在静态视图控制器上实现滑动时,它按预期工作。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var viewSwipe: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(swipeUp(_:)))
        swipeUp.direction = UISwipeGestureRecognizer.Direction.up
        self.viewSwipe.addGestureRecognizer(swipeUp)

        let swipedown = UISwipeGestureRecognizer(target: self, action: #selector(swipeDown(_:)))
        swipedown.direction = UISwipeGestureRecognizer.Direction.down
        self.viewSwipe.addGestureRecognizer(swipedown)
    }

    @objc func swipeUp(_ gesture: UISwipeGestureRecognizer) {
        print("swiped up")
    }

    @objc func swipeDown(_ gesture: UISwipeGestureRecognizer) {
        print("swiped down")
    }
}

红色区域需要滑动

截屏

4

3 回答 3

7

仅在视图中添加Gesture,您还可以在手势上添加任何方向。这里我放了一个小例子,你可以参考这个代码来解决你的问题。

向右取 1,向左取 2

例子 :

import UIKit

class ViewController: UIViewController,UIGestureRecognizerDelegate{

 @IBOutlet weak var viewGray: UIView!
 @IBOutlet weak var viewRed: UIView!

 override func viewDidLoad() {
     super.viewDidLoad()

   self.navigationController?.interactivePopGestureRecognizer?.delegate = self

   let directions: [UISwipeGestureRecognizer.Direction] = [.right, .left]
     for direction in directions {
        let gesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(sender:)))
        gesture.direction = direction
        gesture.delegate = self
        self.viewRed.addGestureRecognizer(gesture)
     }
  }

  @objc func handleSwipe(sender: UISwipeGestureRecognizer) {
    print(sender.direction)
  }

   func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
       return true
   }

  func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
      return true
  }
}

在此处输入图像描述

于 2020-02-06T09:07:40.743 回答
2

您的代码应该可以工作。如果不存在,则可能与不同的手势识别器发生冲突。要解决此冲突,您可以设置delegate您的swipeUpswipeDown识别器:

class ViewController: UIViewController, UIGestureRecognizerDelegate 

swipeUp.delegate = self
swipeDown.delegate = self

并尝试调查此委托函数中发生的情况(使用断点或打印,由您决定):

func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return false
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

如果没有调用此委托函数,则当您尝试滑动时。然后可能对您的内容有不同的(即不可见的)视图。

于 2020-02-06T09:02:38.790 回答
0

你的代码会工作。只需尝试将您的视图控制器呈现为全屏,以防 iOS 13。请参阅以下代码。

let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc: UIViewController = storyboard.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)
于 2020-02-06T09:13:22.880 回答