iPhone OS是否支持隐式动画?

Tha*_*nks 1 iphone core-animation

Mac OS X中的示例:

[[aView animator] setFrame:NSMakeRect(100.0,100.0,300.0,300.0)]; 
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*arg 6

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

[UIView beginAnimations:nil context:nil];
[aView setFrame:NSMakeRect(100.0,100.0,300.0,300.0)];
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

这里记录确切的细节.

每个视图也始终都是图层支持,因此您不必打开图层以获得用于显式动画的图层.


jus*_*ger 6

事实证明,iPhone OS确实支持CALayer上的隐式动画,如Apple的核心动画编程指南中所定义.在Mac OS X上,通过设置以下内容,当图层支持NSView时,该图层将变为可动画:

[view setWantsLayer:YES];
Run Code Online (Sandbox Code Playgroud)

在iPhone OS上,只需将图层委托设置为UIViewController派生类,该类承载您想要设置动画的UIView派生对象.例如,如果您为UILabel定义了一个名为label的属性,则在托管它的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);
}
Run Code Online (Sandbox Code Playgroud)

然后,只需更改位置,标签就会以与在Mac OS X上完全相同的方式进行动画处理.

一些关于此的说明:

  1. 肯定是UIViewController是委托,而不是UIView.制作代表UIView会导致应用程序爆炸.

  2. 委托需要在UIViewController派生类完全加载后调用的方法中设置,即在类所托管的控件的事件处理程序中.我尝试在initWithNibName中添加它:bundle:,awakeFromNib,viewDidLoad和viewWillAppear:animated并且它不起作用.在前两种方法中设置委托导致标签不动画; 它只是立即改变立场.在最后两个中添加它会导致标签完全消失.

  3. 在委托在事件处理程序中设置一次后,它将适用于UIViewController派生类的生命周期的剩余时间.更改其他事件处理程序中的图层属性将使它们动画,而无需再次为图层设置委托.

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

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

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