いくつかのこと。
まず、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);
}