1

メインビューをタップしてタップハンドラーがCALayerオブジェクトのframeプロパティを変更すると、レイヤーオブジェクトがその位置とサイズにアニメーション化されるiOSサンプルコードがいくつかあります。

しかし、そのアニメーションをViewController's の中に入れると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];

ship1.frame = CGRectMake(0, 0, 300, 200);

その後、アニメーションは発生しません。(0, 0, 300, 200)アニメーションなしで を使用するだけです。それはなぜですか、それを機能させる方法は?

4

3 に答える 3

6

いくつかのこと。

まず、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);
}
于 2012-04-29T03:22:02.170 に答える
1

時間遅延またはアニメーション時間が指定されていません。そのため、オブジェクトは表示される前に移動され、以前の位置には表示されません。また、ディスプレイにアニメーションを表示するには、実行ループに戻る必要があります。

于 2012-04-29T01:03:01.320 に答える