Swift: Почему Tap Gesture Recognizer не работает каждый раз? - PullRequest
0 голосов
/ 08 января 2020

У меня странная проблема. У меня есть базовый c распознаватель жестов касания, добавленный в мое подпредставление, но он работает только тогда, когда это нравится. Иногда это работает при втором щелчке, иногда при третьем или даже большем количестве щелчков. Но когда я добавил print("whatever") в функцию, которая вызывается распознавателем жестов, она всегда работает при первом щелчке по подпредставлению.

Как это исправить?

Вкл. в этих двух примерах возникает та же проблема:

Подвид:

let getGiftGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.getGift))
self.continueButton.addGestureRecognizer(getGiftGestureRecognizer)
        DispatchQueue.main.async {
            self.coverAnyUIElement(element: self.successView)
            let gift = SCNNode()
             gift.geometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)

             //nahodne vygenerovat geometry, nebo barvu
             let ownedGeometries = UserDefaults.standard.array(forKey: "ownedGeometries")
             let ownedColors = UserDefaults.standard.array(forKey: "ownedColors")
             let notOwnedGeometriesCount = geometriesCount - ownedGeometries!.count
             let notOwnedColorsCount = colorsCount - ownedColors!.count

             if notOwnedGeometriesCount == 0{
                 //mam vsechny geometrie
                 //vygeneruju barvu

             }else if notOwnedColorsCount == 0{
                 //mam vsechny barvy
                 //vygeneruju geometrii
             }else if(notOwnedGeometriesCount == 0 && notOwnedColorsCount == 0){
                 //mam uplne vsechno

             }else{
                 //vygeneruj cokoliv
                 let random = Int.random(in: 0...10)
                 if random <= 3{

                     //vygeneruj geometrii
                 }else{
                     //vygeneruj barvu
                 }
             }
             print(self.generateColor())
             print(self.generateGeometry())



            self.chest.opacity = 1
             self.chest.position.y = -1.8
             self.world.addChildNode(self.chest)
             let viko = self.chest.childNode(withName: "viko", recursively: false)
             self.chest.addChildNode(gift)

            print("VLAKNO1: \(Thread.isMainThread)")
             viko?.runAction(SCNAction.rotateBy(x: 0, y: 0, z: -90/(180/CGFloat.pi), duration: 1),completionHandler: {
                print("VLAKNO2: \(Thread.isMainThread)")

                    let pohyb = SCNAction.move(by: SCNVector3(0,4,0), duration: 1)
                    gift.runAction(pohyb,completionHandler: {
                       print("VLAKNO3: \(Thread.isMainThread)")

                            self.showConfirmGiftButton()


                    })


             })
        }
    }

Кнопка:

confirmGiftButton.addTarget(self, action: #selector(acceptedGift), for: .touchUpInside)
@objc func acceptedGift(){
        DispatchQueue.main.async {
            UIButton.animate(withDuration: 0.2, animations: {
                self.confirmGiftButton.alpha = 0.9
            }) { (_) in
                UIButton.animate(withDuration: 0.2, animations: {
                    self.confirmGiftButton.alpha = 1
                }) { (_) in

                    //print("VLAKNO1: \(Thread.isMainThread)")
                    self.chest.runAction(SCNAction.fadeOut(duration: 0.5),completionHandler: {
                       // print("Vlakno: \(Thread.isMainThread)")
                        self.chest.removeFromParentNode()
                        self.moveToMenu()
                    })
                    //print("VLAKNO2: \(Thread.isMainThread)")
                    self.coverAnyUIElement(element: self.confirmGiftButton)
                }
            }
        }
    }

1 Ответ

1 голос
/ 08 января 2020

Таким образом, я удалил DispatchQueue.main.async из обоих методов и попробовал его несколько раз, и кажется, что это была проблема, потому что теперь и распознаватель жестов подпредставления, и цель кнопки работают при первом нажатии правильно.

Я думаю, что это было вызвано тем, что, когда я нажал на кнопку, основной поток уже использовался, поэтому он каким-то образом пропустил методы. И работал во втором или большем количестве щелчков, потому что за это время он был уже пуст.

...