5

私はCoreAnimationを学び、サンプル例を試しています。

次のコードを使用すると、アニメーションの長さが機能します

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

//Modifying base layer
self.view.layer.backgroundColor = [UIColor orangeColor].CGColor;
self.view.layer.cornerRadius = 20.0;
self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20);

//Adding layer
mylayer=[CALayer layer]; //mylayer declared in .h file
mylayer.bounds=CGRectMake(0, 0, 100, 100);
mylayer.position=CGPointMake(100, 100); //In parent coordinate
mylayer.backgroundColor=[UIColor redColor].CGColor;
mylayer.contents=(id) [UIImage imageNamed:@"glasses"].CGImage;

[self.view.layer addSublayer:mylayer];
}


- (IBAction)Animate //Simple UIButton
{
[CATransaction begin];

// change the animation duration to 2 seconds
[CATransaction setValue:[NSNumber numberWithFloat:2.0f] forKey:kCATransactionAnimationDuration];

mylayer.position=CGPointMake(200.0,200.0);
mylayer.zPosition=50.0;
mylayer.opacity=0.5;

[CATransaction commit];
}
@end

一方、ViewDidLoadボタンの下部にあるAnimateメソッドコードをまとめて、ボタンを押さなくても実行できるようにした場合、アニメーションの継続時間は考慮されません。アニメーションなしで最終結果が表示されます。

何かご意見は?

ありがとうKMB

4

1 に答える 1

17

不足している情報は次のとおりです。アプリには2 つのレイヤー階層があります。通常操作するモデルレイヤー階層があります。次に、画面上の内容を反映するプレゼンテーションレイヤー階層があります。詳細については、 Core Animation Programming Guideの「Layer Trees Reflect Different Aspects of the Animation State」を参照するか、(強くお勧めします) WWDC 2011の Core Animation Essentials ビデオをご覧ください。

作成したすべてのコードは、モデル レイヤーで動作します (そうあるべきです)。

システムは、変更されたアニメート可能なプロパティ値をモデル レイヤーから対応するプレゼンテーション レイヤーにコピーするときに、暗黙的なアニメーションを追加します。

のビュー階層にあるモデル レイヤーのみUIWindowがプレゼンテーション レイヤーを取得します。viewDidLoadウィンドウに追加される前にシステムから送信さself.viewれるため、実行中のプレゼンテーション レイヤーself.viewまたはカスタム レイヤーはまだありませんviewDidLoad

したがって、ビューとレイヤーがウィンドウに追加され、システムがプレゼンテーション レイヤーを作成した後で、後でプロパティを変更する必要があります。viewDidAppear:十分に遅いです。

- (void)viewDidLoad {
    [super viewDidLoad];

    //Modifying base layer
    self.view.layer.backgroundColor = [UIColor orangeColor].CGColor;
    self.view.layer.cornerRadius = 20.0;
    self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20);

    // Adding layer
    mylayer = [CALayer layer]; //mylayer declared in .h file
    mylayer.bounds = CGRectMake(0, 0, 100, 100);
    mylayer.position = CGPointMake(100, 100); //In parent coordinate
    mylayer.backgroundColor = [UIColor redColor].CGColor;
    mylayer.contents = (id)[UIImage imageNamed:@"glasses"].CGImage;    
    [self.view.layer addSublayer:mylayer];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [CATransaction begin]; {
        [CATransaction setAnimationDuration:2];
        mylayer.position=CGPointMake(200.0,200.0);
        mylayer.zPosition=50.0;
        mylayer.opacity=0.5;
    } [CATransaction commit];
}
于 2012-10-18T02:18:37.210 に答える