Жест смахивания не вызывается для подпредставления внутри текущего контроллера представления - PullRequest
1 голос
/ 06 февраля 2020

Я представил контроллер представления, и у меня есть подпредставление в нем. Я добавил жест смахивания на подпредставление. Размах жест не вызывается. Вместо этого представленный контроллер представления пытается отклонить себя, то есть отключиться. Как мне переопределить жест смахивания, чтобы он распознавался подпредставлением вместо суперпредставления. Когда я реализовал смахивание на контроллере представления stati c, он работает как положено.

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")
    }
}

Для красной области необходимо получить смахивание

screenshot

Ответы [ 3 ]

5 голосов
/ 06 февраля 2020

Добавить 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
  }
}

enter image description here

1 голос
/ 06 февраля 2020

Ваш код должен работать. Если нет, вероятно, конфликт с другим распознавателем жестов. Чтобы разрешить этот конфликт, вы можете установить delegate на своих swipeUp и swipeDown распознавателях:

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
}

Если не вызывается ни одна из этих функций делегата, когда вы пытаетесь провести пальцем. Тогда, возможно, существует другой (ie невидимый) вид вашего контента.

0 голосов
/ 06 февраля 2020

ваш код будет работать. Просто попробуйте представить ваш контроллер представления в полноэкранном режиме в случае 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)
...