Может ли MotionDetection в Swift выполнять 2 разных действия? - PullRequest
0 голосов
/ 22 декабря 2018

Я обнаруживаю, когда пользователь встряхивает свой телефон.Можно ли выполнить 2 независимых действия?Я имею в виду сначала сделай это1, затем сделай это2.

override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
    if motion == .motionShake {
        // first this needs to be done
        let scene = makeScene()
        animationView.frame.size = scene.size
        animationView.presentScene(scene)

        // then this needs to be done
        let scene2 = makeScene2()
        animationView.frame.size = scene2.size
        animationView.presentScene(scene2)
    }
}

Когда я делаю это, выполняется только второй

Ответы [ 2 ]

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

Вместо того, чтобы иметь дело с жестко заданными задержками, попробуйте обернуть вашу анимацию в CATransaction и запустите второй шаг в обработчике ее завершения:

override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
   if motion == .motionShake {
      CATransaction.begin()

      let scene = makeScene()
      animationView.frame.size = scene.size
      animationView.presentScene(scene)

      CATransaction.setCompletionBlock {
         let scene2 = self.makeScene2()
         self.animationView.frame.size = scene2.size
         self.animationView.presentScene(scene2)
      }


      CATransaction.commit()
   }
}
0 голосов
/ 22 декабря 2018

Решил проблему, добавив задержку между действиями.

override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
    if motion == .motionShake {

        let scene = makeScene()
        animationView.frame.size = scene.size
        animationView.presentScene(scene)

        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {

            let scene2 = self.makeScene2()
            self.animationView.frame.size = scene2.size
            self.animationView.presentScene(scene2)

        })


    }
    }
    }
...