2016-11-09 2 views
0

Я пытаюсь создать 3D-игру с Swift. Когда игрок умирает, на экране должен отображаться UIButton. Проблема в том, что кнопка имеет очень большую задержку (примерно 5 секунд) до появления кнопки. Я использовал тот же код, что и для игры SpriteKit. Я попытался напечатать сообщение в консоли, когда должна отображаться кнопка, и это сообщение пришло незамедлительно.Задержка отображения кнопки SceneKit

Моя кнопка:

func createRespawnButton() { 
    restartButton = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width/3, height: 50)) 
    restartButton.setTitle("Play Again!", for: UIControlState.normal) 
    restartButton.setTitleColor(UIColor.cyan, for: UIControlState.normal) 
    restartButton.center = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height/2) 
    restartButton.addTarget(self, action: #selector(self.restartGame), for: UIControlEvents.touchDown) 

    self.view.addSubview(restartButton) 
} 

Эта функция вызывается, когда 2 машины сталкиваются друг с другом. Может ли кто-нибудь помочь мне сделать мою кнопку на экране без такой большой задержки? Спасибо!

ответ

2

От documentation:

По большей части, используют классы UIKit только из основного потока вашего приложения. Это особенно справедливо для классов, полученных из UIResponder, или для управления пользовательским интерфейсом вашего приложения.

Вызывается ли ваша функция в основной теме? SCNSceneRendererDelegate методы делегирования вызываются в очереди рендеринга SceneKit. Если вы обнаружите столкновение, вы хотите отправить вызов вашей функции в основную очередь:

DispatchQueue.main.async { 
    createRespawnButton() 
} 
+0

Большое вам спасибо за помощь! Это сработало отлично! Спасибо друг! –

Смежные вопросы