Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Ios CALayer代理如何触发自定义属性的显示更新(在动画期间)?_Ios_Macos_Core Animation - Fatal编程技术网

Ios CALayer代理如何触发自定义属性的显示更新(在动画期间)?

Ios CALayer代理如何触发自定义属性的显示更新(在动画期间)?,ios,macos,core-animation,Ios,Macos,Core Animation,CALayer似乎拥有在运行时使用委托和/或层的actions属性向层添加属性所需的几乎所有功能,而无需子类化。但是,有一件事我还没有弄明白,当动画中的这些动态属性之一发生更改时,如何触发显示更新 我知道如何在CALayer的自定义子类中实现这一点:只需定义子类中的属性,将它们标记为@dynamic,并覆盖需要显示forkey:并返回自定义属性的YES。然后,在动画期间将调用display,默认情况下,甚至会触发对层代理的drawLayer:inContent:方法的调用(如果存在的话)(尽管它

CALayer
似乎拥有在运行时使用委托和/或层的
actions
属性向层添加属性所需的几乎所有功能,而无需子类化。但是,有一件事我还没有弄明白,当动画中的这些动态属性之一发生更改时,如何触发显示更新

我知道如何在
CALayer
的自定义子类中实现这一点:只需定义子类中的属性,将它们标记为
@dynamic
,并覆盖
需要显示forkey:
并返回自定义属性的
YES
。然后,在动画期间将调用
display
,默认情况下,甚至会触发对层代理的
drawLayer:inContent:
方法的调用(如果存在的话)(尽管它的有用性值得怀疑,因为您已经有了可以实现
drawInContext:
)的子类。然而,我试图看看这在不子类化CALayer的情况下是否可行

通过在层的
actions
属性中安装
CAAction
,或在层代理中实现
actionForLayer:forKey:
,并让该操作向层发送
setNeedsDisplay
消息,我可以仅使用层代理来支持动画之外的更新。但是,在动画过程中,
actionForKey:
显然没有被调用(这是有意义的,因为它用于触发隐式动画),并且我可以看到,在层代理协议中没有与
needsDisplayForKey:
等价的东西


那么,除了上述内容之外,还有什么方法可以告诉
CALayer
调用
display
自定义属性呢?或者,是否无法单独在层代理中实现可设置动画的自定义层特性?苹果似乎更喜欢在可能的情况下使用委托,但在动画过程中没有刷新层内容的方法,委托界面是不完整的。有什么建议吗?

让我问你这个问题:你如何将这个属性标记为
@dynamic
,你知道你需要这样做吗?@matt:如果你没有子类化,你当然不能。但这似乎对其他任何事情都无关紧要;
@dynamic
所做的只是告诉编译器一些访问器方法将在运行时生成。但即使没有访问器,CALayer也允许您使用
valueForKey:
setValue:forKey:
添加虚拟属性。正如我所说,除了在动画期间触发
显示
更新之外,所有这些都可以工作。也许这不应该起作用,但是,伙计,他们太接近了!好的,你实际上不需要
@dynamic
,只要你不尝试通过隐式属性动画调用这个东西-如果你要用一个关键路径进行CABASICanization,那么
需要显示forkey
(和一个绘图实现)就是你所需要的。那么你肯定可以这样做吗?@matt,是的,我可以在CALayer子类中实现
needsDisplayForKey:
,但我不知道如何仅使用层委托来提供等效的功能。这就是我想弄明白的(如果可能的话)。啊哈。不,我也不知道怎么做。这个想法很吸引人,但很明显,他们并没有将其构建到委托模型中。你可以提交一个功能请求,但不要屏住呼吸:我怀疑他们是否想搞砸这件事,因为整个纸牌屋都依赖于它。让我问你这个问题:你如何将这个属性标记为
@dynamic
,你知道你需要这样做吗?@matt:如果你不是子类化,你当然不能。但这似乎对其他任何事情都无关紧要;
@dynamic
所做的只是告诉编译器一些访问器方法将在运行时生成。但即使没有访问器,CALayer也允许您使用
valueForKey:
setValue:forKey:
添加虚拟属性。正如我所说,除了在动画期间触发
显示
更新之外,所有这些都可以工作。也许这不应该起作用,但是,伙计,他们太接近了!好的,你实际上不需要
@dynamic
,只要你不尝试通过隐式属性动画调用这个东西-如果你要用一个关键路径进行CABASICanization,那么
需要显示forkey
(和一个绘图实现)就是你所需要的。那么你肯定可以这样做吗?@matt,是的,我可以在CALayer子类中实现
needsDisplayForKey:
,但我不知道如何仅使用层委托来提供等效的功能。这就是我想弄明白的(如果可能的话)。啊哈。不,我也不知道怎么做。这个想法很吸引人,但很明显,他们并没有将其构建到委托模型中。你可以提交一个功能请求,但不要屏住呼吸:我怀疑他们是否想搞砸这件事,因为整个纸牌屋都依赖于它。