Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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中的隐式动画究竟何时发生?_Ios_Core Animation - Fatal编程技术网

iOS中的隐式动画究竟何时发生?

iOS中的隐式动画究竟何时发生?,ios,core-animation,Ios,Core Animation,每一个人和每一本书都声称在CALayer中有隐含的动画发生。然而,到目前为止,每次我想验证这一点时,我最终都会硬捕捉到设置的值。完全没有动画 下面是一个项目中没有其他事情发生的例子。我所做的就是创建一个视图,然后获取它的CALayer实例,然后做一些应该隐式设置动画的事情 [theLayer setValue:[NSNumber numberWithFloat:M_PI * 1.1] forKeyPath:@"transform.rotation.z"]; 另一个: CGRect curren

每一个人和每一本书都声称在CALayer中有隐含的动画发生。然而,到目前为止,每次我想验证这一点时,我最终都会硬捕捉到设置的值。完全没有动画

下面是一个项目中没有其他事情发生的例子。我所做的就是创建一个视图,然后获取它的CALayer实例,然后做一些应该隐式设置动画的事情

[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动画块中的隐式。还有两种解决方案:

  • 使需要动画的层成为视图的子层。请参阅[答覆][2]

    [2] :隐式动画的淡入不起作用。我试过了,效果如预期

  • 将图层的代理指定给图层本身。iOS中该层的默认代理是其backing store视图,该视图实现actionForLayer:(id)layer forKey:(NSString*)键并返回[NSNull null]以禁用该层的隐式动画

  • 实际上,您可以返回nil来获得CALay的默认动画

    • (id)actionForLayer:(CALayer*)层forKey:(NSString*)事件{ 返回零; }

    回答得很好!我很好奇-你从哪里得到这些详细信息的?我查阅了这么多的书籍和资料,但它们缺乏这些细节,大部分是反复试验。如果在UIView子类上重写
    -actionForLayer:forKey:
    ,则可以注销对super的调用结果,并将其与是否存在活动动画块相关联。如果你仔细想想,这也很有意义——UIView是CALayer的委托,
    -actionForLayer:forKey:
    是你想要禁用隐式动画的合适位置。这很有意义。谢谢但为什么官方文件中没有写这一点?!它只是说“要触发隐式动画,您所要做的就是更新图层对象的属性。”@MatterGoal:您引用的文档是CoreAnimation文档。这是正确的;在常规的
    CALayer
    中,隐式动画起作用。这里的诀窍是,属于
    ui视图的
    CALayer
    s的隐式动画被禁用。但是您自己创建的任何
    CALayer
    s仍然可以获得它们。/*如果已定义,则由*-actionForKey:方法的默认实现调用。应返回实现*CAAction协议的对象。如果委托未指定*当前事件的行为,则可能返回“nil”。返回空对象(即.'[NSNull null]')显式强制不进行进一步搜索。(即*+defaultActionForKey:方法将不会被调用。)*/