Intereting Posts
Пользовательская реализация с ансамблями Возможно ли перекрывать представления с помощью AutoLayout JWPlayer отключает титры в субтитрах iOS Внешний вид контроллера корневого каталога исчезает при нажатии другого регулятора вида Проверьте права доступа к iOS-устройству для моего приложения Использование сжатия zip для моих ресурсов приложений iOS? Почему MBProgressHUD не отображается, когда появляется предупреждение перед показом HUD? Использование камеры через UIImagePickerController приводит к сбоям на iPod IOS, пользовательская панель для просмотра таблицы с наблюдателями, как отделить наблюдатели MapKit: просмотры аннотаций пока не отображаются до прокрутки карты Как получить «искать» время в MPMoviePlayerController? Может ли приложение Apple Watch иметь несколько взглядов? Таблицы данных iOS и оптимальное хранилище «Прекращено из-за ошибки памяти» при попытке сделать GIF в какао с Swift Можно ли определить, было ли приложение удалено на устройстве через систему обратной связи APN?

SceneKit SCNAction.run и вращение не работают

У меня есть сцена с ящиком, на котором нужно запустить действие вращения навсегда:

dps – это свойство, которое может быть изменено пользователем.

 override func viewDidAppear() { super.viewDidAppear() let scene = SCNScene() scene.rootNode.addChildNode(boxNode) self.rateScene.scene = scene let actionwait = SCNAction.wait(duration: 0.001) let run = SCNAction.run {_ in let fps = 60.0 let delta = (self.dps*3.14/180.0)/fps self.boxNode.rotation.z -= CGFloat(delta) } let moveSequence = SCNAction.sequence([actionwait, run]) let forever = SCNAction.repeatForever(moveSequence) boxNode.runAction(forever) } 

Variable self.boxNode.rotation.z – изменяется каждый раз, но окно не вращается.

Это не будет работать, потому что SCNAction.run просто оценивается один раз. Вы должны переназначить действие каждый раз, когда вы меняете значение.

То, что вы могли бы сделать, это нечто подобное. Проще говоря, этот код в IBAction вашего слайдера (или того, что пользователь использует для управления значением)

 let fps = 60.0 let delta = (self.dps * 3.14 / 180.0) / fps SCNTransaction.begin() SCNTransaction.animationDuration = 0.1 boxNode.rotation.z -= Float(delta) SCNTransaction.commit() 

Как насчет сохранения свойства DPS на сцене или владельца сцены и использования didSet в DPS? Команда didSet сбросит вращение, что-то вроде:

 let radiansPerSecond = M_PI / 180.0 * dps let rotate = SCNAction.repeatForever(SCNAction.rotateBy(x: 0.0, y: 0, z: radiansPerSecond, duration: 1.0)) boxNode.runAction(rotate) 

Изменение DPS может быть обнаружено в течение 1 секунды, и ваше действие перезапускается с новой скоростью вращения. И вам не нужно устанавливать новую SCNAction 60 раз в секунду.