iPhone OS是否支持隐式动画?

时间:2009-07-24 06:38:00

标签: iphone core-animation

来自Mac OS X的示例:

[[aView animator] setFrame:NSMakeRect(100.0,100.0,300.0,300.0)]; 

我在UIKit中尝试了类似的东西,但似乎动画方法不适用于UIView。那么没有“隐含”的动画?

2 个答案:

答案 0 :(得分:6)

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

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

详细的详细信息记录在案here

每个视图也始终都是图层备份,因此您不必打开图层以获取显式动画图层。

答案 1 :(得分:6)

原来,iPhone OS确实支持CALayer上的隐式动画,如Apple的核心动画编程指南中所定义。在Mac OS X上,通过设置:

,当图层支持NSView时,该图层将变为可动画
[view setWantsLayer:YES];

在iPhone OS上,只需将图层委托设置为UIViewController派生类,该类承载您要设置动画的UIView派生对象。例如,如果您为UILabel定义了一个名为label的属性,则在托管它的UIViewController派生类中,代码看起来像这样(UIButton Touch Up Inside事件的事件处理程序示例):< / p>

-(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. 委托一次设置后,
  4. 事件处理程序,它会很好 剩余的生命周期 UIViewController派生类。 更改图层属性 其他事件处理程序将导致它们 动画而不设置 再次代表该层。

  5. 当UIViewController派生类失去焦点时,必须在viewWillDisappear:animated方法中将委托设置为nil,否则应用程序将会爆炸

  6. 必须有一些地方只设置一次委托,所以由于调用事件处理程序而没有多次设置,但我还没有找到那个地方。至少它以这种方式工作,并且由于多次调用事件处理程序而多次设置它似乎无害。

    如果核心动画编程指南中记录了这一点,那肯定会很好。我花了好几天试图解决这个问题!希望这可以省去所有狩猎的麻烦!