我有两个非常相似的macOS应用程序。一个应用程序在2-D中呈现动画,使用Quartz调用,在NSView
的子类中,另一个应用程序,在SCNView
的子类中的3-D动画(本身是{{1}的子类使用SceneKit几何。)在每种情况下,“视图”由视图控制器拥有,并且所有权在故事板中设置。在每种情况下,我都使用计时器来每秒弄脏视图,以便触发NSView
来驱动动画移动。在每种情况下,我都使用过:drawRect
在2-D情况下,在视图实例中调用self.view.needsDisplay = true
,在3-D情况下调用它(即使是初始渲染)。
我很困惑! drawRect
会阻止对SCNView
的调用吗?如果是这样,我怎么能绕过这个?如果没有,我错过了什么巫毒秘密?
如果这种行为不是读者所期望的,我将发布展示它的示例项目。
我知道SceneKit可以利用Core Animation但我想在两个应用程序中保持相同的通用计时器机制,因为动画内容基本上是相同的动作,2-D中的平面是球形的在3-D中使用SceneKit渲染是有意义的。
添加了一个Xcode项目,以显示不同的drawRect
和NSView
行为:
https://www.dropbox.com/s/qtymzitkqcqhfje/SCN.zip?dl=0
答案 0 :(得分:1)
你正在与框架作斗争。
SceneKit有自己的渲染和动画定时器。抓住那些来更新你的对象'属性(位置,颜色等)。让SceneKit处理绘制调用。
您需要的方法可能在意想不到的地方。查看SCNSceneRenderer
和SCNSceneRendererDelegate
协议的文档。 renderer delegate documentation解释了渲染循环,并显示了自定义应用的动画和物理的位置。