2009-07-24 68 views

回答

6

iPhone支持隐式动画,虽然它不使用animator对象,但它直接构建到UIView中。试试这个:

[UIView beginAnimations:nil context:nil]; 
[aView setFrame:NSMakeRect(100.0,100.0,300.0,300.0)]; 
[UIView commitAnimations]; 

确切的细节记录在here

每个视图都始终支持层,所以您不必打开图层以获取显式动画的图层。

+0

这不是一个明确的动画?或者有什么不同? – Thanks 2009-07-24 16:31:02

+1

否。显式动画是当您直接使用CoreAnimation并将CAAnimations附加到图层时。隐式动画是当你设置一些关于动画的参数时,但除此之外,只需在视图上设置普通属性并让系统为你制作动画。在桌面上,隐式动画是通过代理转发所有NSView完成的,UIView知道如何在不使用代理的情况下处理它,你只需告诉它你希望它通过类方法构造隐式动画。 – 2009-07-24 17:28:50

+0

路易斯,你是我的英雄! – 2011-01-20 17:46:50

6

原来iPhone OS确实支持在Apple的Core Animation Programming Guide中定义的CALayer上的隐式动画。

[view setWantsLayer:YES]; 

在iPhone OS,只需将层代表到的UIViewController派生类承载的UIView派生的对象,你想:在Mac OS X,当它通过设置备份的一个NSView一个层变成动画动画。例如,如果您有一个为称为标签的UILabel定义的属性,则在托管它的UIViewController派生类中,代码将如下所示(UIButton Touch Up Inside事件的事件处理程序示例):

-(void) buttonPressedToAnimateTheLabel:(id)sender 
{ 
    CALayer *labelLayer = self.label.layer; 

    labelLayer.delegate = self; 

    layer.position = CGPointMake(labelLayer.position.x, labelLayer.position.y + 50); 
} 

然后只需通过更改位置,标签就会以与在Mac OS X上完全相同的方式进行动画制作。

关于这个的一些注意事项:

  1. 绝对是 的UIViewController那是 代表,而不是UIView的。制作 UIView委托导致应用程序 炸毁。

  2. 委托需要在一个称为 方法要设置的 的UIViewController派生的类具有 完全完成装载,即在后为 由类托管的控制 事件处理程序。我尝试在initWithNibName:bundle: 中添加 它awakeFromNib,viewDidLoad和 viewWillAppear:动画,它没有工作 。在 中设置代理,前两种方法导致 标签不生成动画;它只是 立即改变位置。 在最后两个中添加它会导致 标签完全消失。委托是在 事件处理程序设置一次

  3. 后,这将有利于 的的 的UIViewController派生类的寿命的剩余部分。 更改 其他事件处理程序中的图层属性将使其 生成动画,而无需再次为该图层设置 委托。

    时的UIViewController派生类失去焦点
  4. ,委托必须设置为零的viewWillDisappear:动画的方法,否则应用程序将炸毁

必须有一些地方设置只委托一次,所以它不会被设置多次作为一个事件处理程序被调用的结果,但我还没有找到那个地方。至少它以这种方式工作并多次设置,因为多次调用事件处理程序似乎是无害的。

如果将它全部记录在Core Animation Programming Guide中,那肯定会很好。我花了好几天的时间来解决这个问题!希望这可以节省寻找它的所有麻烦!

+0

我在添加委托之前遇到了与图层不相同的问题(只是跳跃)。不过,我(至少在iPad上为3.2)能够在viewDidLoad()方法中设置委托,并且它可以正常工作。 – 2010-07-08 15:22:17

+0

我无法得到这个工作,但它显示了承诺。我非常想知道更多关于此的信息,因为无时无刻不得不设置动画块。 – 2011-04-15 07:42:39