几件事。
首先,frame 属性是不可动画的。相反,您应该为边界(以更改大小)和位置(以移动图层)设置动画。
引用文档:
注意:frame 属性不能直接设置动画。相反,您应该对 bounds、anchorPoint 和 position 属性的适当组合进行动画处理,以实现所需的结果。
其次,在更改动画属性之前,您必须在添加图层后返回事件循环。
当您返回并且系统访问事件循环时,下次您更改可动画属性时,它会创建一个动画事务来为该更改设置动画。
由于您创建了一个图层,设置了它的框架,然后更改了它,所有这些都在返回之前,您的代码只需将图层添加到它的最后一帧。
相反,您应该做的是设置图层,将其安装到其父图层中,然后返回。您可以使用 performSelector:withObject:afterDelay: 在添加图层后调用动画:
- (void)viewDidLoad
{
UIImage *shipImage = [UIImage imageNamed:@"SpaceShip1.png"];
ship1 = [[CALayer alloc] init];
ship1.contents = (id) [shipImage CGImage];
ship1.frame = CGRectMake(50, 50, 100, 100);
[self.view.layer addSublayer:ship1];
[self performSelector: @selector(changeLayer)
withObject: nil
afterDelay: 0.0];
}
- (void) changeLayer
{
//Animate changes to bounds and position, not frame.
ship1.bounds = CGRectMake(0, 0, 300, 200);
//Note that position is based on the center of the layer by default, so you'll
//need to adjust your desired position.
ship1.position = CGPointMake(0,0);
}