来自Mac OS X的示例:
[[aView animator] setFrame:NSMakeRect(100.0,100.0,300.0,300.0)];
我在UIKit中尝试了类似的东西,但似乎动画方法不适用于UIView。那么没有“隐含”的动画?
答案 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上完全相同的方式进行动画处理。
关于此的一些注意事项:
绝对是 UIViewController即是 代表,而不是UIView。制作一个 UIView委托导致应用程序 爆炸。
需要在一个中设置委托 方法之后调用 UIViewController派生类有 完全加载,即在 控件的事件处理程序 由班级主持。我尝试添加 它在initWithNibName:bundle:中, awakeFromNib,viewDidLoad和 viewWillAppear:动画,它做到了 不行。设置委托 前两种方法造成的 标签不动画;它只是 立即改变立场。 在最后两个中添加它导致了 标签完全消失。
事件处理程序,它会很好 剩余的生命周期 UIViewController派生类。 更改图层属性 其他事件处理程序将导致它们 动画而不设置 再次代表该层。
当UIViewController派生类失去焦点时,必须在viewWillDisappear:animated方法中将委托设置为nil,否则应用程序将会爆炸
必须有一些地方只设置一次委托,所以由于调用事件处理程序而没有多次设置,但我还没有找到那个地方。至少它以这种方式工作,并且由于多次调用事件处理程序而多次设置它似乎无害。
如果核心动画编程指南中记录了这一点,那肯定会很好。我花了好几天试图解决这个问题!希望这可以省去所有狩猎的麻烦!