У меня есть два приложения macOS, которые очень похожи. Одно приложение отображает анимацию в 2-D, с кварцевыми вызовами, в подклассе NSView
, другое приложение, трехмерную анимацию в подклассе SCNView
(сама по себе подкласса NSView
) с использованием геометрий SceneKit. В каждом случае «вид» принадлежит контроллеру вида и что право собственности устанавливается в раскадровке. В каждом случае я использую таймер для грязного просмотра каждую секунду, поэтому его drawRect
запускается для управления анимированными движениями. В каждом случае я использовал: self.view.needsDisplay = true
может быть вызвано вызовом на SCNView (macOS)?
В двумерном случае в экземпляре вида вызывается drawRect
, в трехмерном случае это не так (даже для исходного рендера).
Я озадачен! Делает SCNView
подавляет звонки на drawRect
? Если да, то как я могу обойти это? Если нет, то какой секрет Voodoo я пропустил?
Если это поведение не соответствует ожиданиям читателей, я отправлю образец проекта, который его демонстрирует.
Я знаю, что SceneKit может использовать Core Animation, но я хочу сохранить один и тот же общий механизм таймера в обоих приложениях, потому что анимированный контент, по сути, одно и то же действие, то, что было плоским в 2-D, является сферическим в 3-D, поэтому использование рендеринга SceneKit имеет смысл.
Добавлен Xcode проект, чтобы показать различные NSView
и SCNView
поведения: https://www.dropbox.com/s/qtymzitkqcqhfje/SCN.zip?dl=0
Теперь я использую эти обратные вызовы и выполняя свои цели, поэтому, спасибо. Я обнаружил, что делаю много вычислений в вызовах делегатов, некоторые из них не нужны, потому что многие свойства объектов не изменяются так быстро, поэтому я увеличиваю счетчик на каждом цикле рендеринга, но только обновляю «медленные» свойства каждые 60 (или более) циклов. Это немного неприятно, но он выполняет свою работу. Спасибо, Hal –