Запуск UITapGestureRecognizer из перекрывающихся представлений - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть один основной вид и 4 подпредставления основного вида, у всех из них есть свой UITapGestureRecognizer, когда я нажимаю на одно подпредставление, как оно может активировать оба вида.Пример ниже,

view hierarchy

, если я нажму на подпредставление 1, желаемым журналом будет:

subview1 is clicked
MainView is clicked

Мой код

override func viewDidLoad() {

    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let mainGesture = UITapGestureRecognizer(target: self, action: #selector(mainGestureActivated))

    self.view.addGestureRecognizer(mainGesture)

    let subGesture = UITapGestureRecognizer(target: self, action: #selector(subViewGestureActivated))

    self.subview1.addGestureRecognizer(subGesture)


}

@objc func mainGestureActivated(){
    print("MainView Clicked")
}

@objc func subViewGestureActivated(){
    print("Subview Clicked")
}

он печатает только просмотренные подпредставления!Можно ли запустить оба gestRecognizer, так как main инкапсулирует другие.

1 Ответ

0 голосов
/ 31 декабря 2018

Сначала вы должны соответствовать UIGestureRecognizerDelegate в вашем VC, а затем реализовать функцию делегата shouldRecognizeSimultaneouslyWith.Внутри функции вы должны определить, являются ли gestureRecognizer и otherGestureRecognizer желаемыми значениями, и, если это так, вы должны позволить им работать одновременно,

  • Соответствуетделегировать и объявлять распознаватели жестов за пределами viewDidLoad (потому что вам необходимо получить к ним доступ в методе делегата позже.)

    var mainGestureRecognizer = UITapGestureRecognizer() var subGestureRecognizer = UITapGestureRecognizer()

  • Инициализировать ваши распознаватели,и установите ваш VC в качестве их делегата:

    mainGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(mainGestureActivated))
    subGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(subViewGestureActivated))
    mainGestureRecognizer.delegate = self
    subGestureRecognizer.delegate = self
    
  • Реализуйте функцию делегата, упомянутую выше, чтобы позволить одновременное распознавание для subView и mainView:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer == subGestureRecognizer && otherGestureRecognizer == mainGestureRecognizer {
            return true
        }
    
        return false
    }
    

И если вы хотите, чтобы оно работало для 4 разных подпредставлений, вам следует проверить с помощью операторов else if внутри метода делегата.

...