iOS中的隐式动画究竟何时发生?
每一个人和每一本书都声称在CALayer中有隐含的动画发生。然而,到目前为止,每次我想验证这一点时,我最终都会硬捕捉到设置的值。完全没有动画 下面是一个项目中没有其他事情发生的例子。我所做的就是创建一个视图,然后获取它的CALayer实例,然后做一些应该隐式设置动画的事情iOS中的隐式动画究竟何时发生?,ios,core-animation,Ios,Core Animation,每一个人和每一本书都声称在CALayer中有隐含的动画发生。然而,到目前为止,每次我想验证这一点时,我最终都会硬捕捉到设置的值。完全没有动画 下面是一个项目中没有其他事情发生的例子。我所做的就是创建一个视图,然后获取它的CALayer实例,然后做一些应该隐式设置动画的事情 [theLayer setValue:[NSNumber numberWithFloat:M_PI * 1.1] forKeyPath:@"transform.rotation.z"]; 另一个: CGRect curren
[theLayer setValue:[NSNumber numberWithFloat:M_PI * 1.1] forKeyPath:@"transform.rotation.z"];
另一个:
CGRect currentBounds = theLayer.bounds;
currentBounds.size.width += 120.f;
[self.animatedLayer setBounds:currentBounds];
视图中当然包含一些内容,因此我可以看到更改。
我看到了视觉上的变化,但这是一个艰难的瞬间。完全没有动画
所以,要么所有这些书都是错的,在写核心动画和隐式动画时,脑子里都有旧的MacOSX知识,要么我做错了什么。有人能提供一个在iPhone上演示隐式动画的工作示例吗?UIKit禁用隐式动画。更具体地说,与UIView关联的CALayer永远不会隐式设置动画。您自己创建的且与UIView无关的Calayer将购买普通隐式动画机制 如果您对它的工作方式感兴趣,那么隐式动画会在normal-actionForKey:lookup之后发生。如果给定属性有CAAction,则使用它。否则,将使用隐式动画。对于与UIView关联的CALayer,UIView实现了
-actionForLayer:forKey:
委托方法,当不在UIView动画块中时,它总是返回[NSNull null]
,表示动作查找应在此停止。这会阻止隐式动画工作。在UIView动画块内部,它构造自己的动作来表示当前的UIView动画设置。同样,这会阻止隐式动画
如果您需要为UIView不适合您的CALayer属性设置动画,则可以使用显式的CAAnimation子类(如Cabasicanition)。您还可以将层的委托设置为自己的对象并处理-actionForLayer:forKey:。似乎即使代理未实现-actionForLayer:forKey:.旧帖子,也会得到隐式动画,但下面的链接指向《核心动画编程指南》中的一节,该节有助于更清楚地了解Kevin Ballard所说的内容。确实需要明确指出的是,为了给UIView的底层层属性设置动画,您需要确保将层的委托设置为将采用“actionForLayer:ForKey:”方法并返回nil的实例。我们发现,您还可以将委托设置为不采用此方法的实例,并且它仍然允许隐式动画,但这是一种草率和混乱的做法
请记住,UIView主层的子层通常不会将UIView作为其代理。因此,它们参与隐式动画,除非您显式阻止此操作,即使您没有提供委托以返回响应actionForLayer:forKey:的nil操作 因此,在通用视图中获取隐式动画的一种简单方法就是添加一个子层,覆盖主层
马特·纽伯格(Matt Neuberg)的书《编程iOS 5》(目前正在Safari Books Online上进行测试)非常清楚地解释了这个话题。凯文·巴拉德的答案完全正确。我想在这里提供更多的东西 来自 有一个部分叫做:iOS中修改图层的规则,您将发现 UIView类默认情况下禁用层动画,但在动画块内重新启用它们 除了启用UIView动画块中的隐式。还有两种解决方案:
实际上,您可以返回nil来获得CALay的默认动画
- (id)actionForLayer:(CALayer*)层forKey:(NSString*)事件{ 返回零; }
-actionForLayer:forKey:
,则可以注销对super的调用结果,并将其与是否存在活动动画块相关联。如果你仔细想想,这也很有意义——UIView是CALayer的委托,-actionForLayer:forKey:
是你想要禁用隐式动画的合适位置。这很有意义。谢谢但为什么官方文件中没有写这一点?!它只是说“要触发隐式动画,您所要做的就是更新图层对象的属性。”@MatterGoal:您引用的文档是CoreAnimation文档。这是正确的;在常规的CALayer
中,隐式动画起作用。这里的诀窍是,属于ui视图的CALayer
s的隐式动画被禁用。但是您自己创建的任何CALayer
s仍然可以获得它们。/*如果已定义,则由*-actionForKey:方法的默认实现调用。应返回实现*CAAction协议的对象。如果委托未指定*当前事件的行为,则可能返回“nil”。返回空对象(即.'[NSNull null]')显式强制不进行进一步搜索。(即*+defaultActionForKey:方法将不会被调用。)*/