Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 核心动画代码结构/约定_Macos_Cocoa_Core Animation - Fatal编程技术网

Macos 核心动画代码结构/约定

Macos 核心动画代码结构/约定,macos,cocoa,core-animation,Macos,Cocoa,Core Animation,在学习核心动画的过程中,我很快就了解到,如果你做得不对,你会有非常奇怪的未定义行为。为此,我有几个问题可以帮助我在概念上更好地理解它 我的NSView子类在其init中声明了以下内容。此视图是普通图层备份视图的子视图 [self setLayer:[CALayer layer]]; [self setWantsLayer:NO]; 在此之后,我应该在什么时候和什么情况下引用self而不是[self layer]?我只使用显式和隐式动画操作层,远离[self setFrame:]等,使用[[s

在学习核心动画的过程中,我很快就了解到,如果你做得不对,你会有非常奇怪的未定义行为。为此,我有几个问题可以帮助我在概念上更好地理解它

  • 我的NSView子类在其init中声明了以下内容。此视图是普通图层备份视图的子视图

    [self setLayer:[CALayer layer]];
    [self setWantsLayer:NO];
    
    在此之后,我应该在什么时候和什么情况下引用self而不是[self layer]?我只使用显式和隐式动画操作层,远离[self setFrame:]等,使用[[self layer]setPosition]等

  • 这种方法的问题是,在应用的任何和所有动画中,视图的实际帧都停留在一个点上。如果我的视图应该接收鼠标事件呢?例如,我有一个使用核心动画的视图,它被鼠标拖动。是否有一种方法可以使视图框架与表示层的当前状态保持同步,以便接收正确的鼠标事件

  • 关于表示层,显然它仅在实际动画正在进行时才可用。是否有任何类型的层属性可以告诉我它在视觉上的实际位置,即使动画没有进行中


首先,您要使用
[自我设置WantLayer:是]
。另外,如果您想提供一个特定的CALayer子类(例如CAScrollLayer),只需在
-SetWantLayer:
之前调用
-setLayer:
;如果您只需要一个普通的CALayer,只需调用
-setWantLayer:
,它就会为您创建。更好的是,只需在Interface Builder中选中“想要图层”选项

其次,使用层备份视图的全部意义在于,您可以继续使用常规的NSView方法,并获得免费的CoreAnimation“tweening”效果。如果您想使用CoreAnimation作为移动项目的唯一方法,那么正确的方法是创建一个包含纯CALayer表示层次结构的层背景视图


我没有看过任何免费提供的CoreAnimation教程,但我绝对可以推荐实用程序员。这本书的作者也提供了它们。

我想你需要重新表述一下你的问题。似乎有一些潜在的误解,但你并没有很清楚地表达出来。你们的问题标题表明你们想了解一些更理论的东西,但你们的实际问题表明你们想了解一些更具体的东西。让我看看能否澄清几件事

  • presentationLayer在“飞行中”时提供有关层当前状态的信息

  • 当没有动画出现时,presentationLayer和层信息将相同。查询图层的边界、边框或位置,以了解其当前在其父坐标空间中的位置

  • NSView必须启用图层备份才能执行动画

  • 确保不只是使用显式动画设置动画,也不实际设置正在设置动画的层值。动画不会自动更改正在设置动画的层的属性。您必须自己将属性更改为结束值,否则它只会“快速恢复”到起始值

  • 如果要为视图设置动画,而不是层,可以使用animator代理,如
    [[view animator]setFrame:newFrame]

  • 在CATRAAction中对动画师的换行调用,以更改动画持续时间之类的内容

让我知道如果你需要一些澄清,更新你的问题。提供一些相关的代码确实有助于识别您在解决问题时遇到的问题