2009-04-30 10 views
2

私はXCodeで新しいビューベースのアプリケーションを作成しました。 ViewControllerで CATransactionがアニメ化しない

は、私が変更しただけのコードは次のようになります。

- (void)viewDidLoad { 
[super viewDidLoad]; 

UIView *newView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
newView.backgroundColor = [UIColor redColor]; 
[self.view addSubview:newView]; 


[CATransaction begin]; 
[CATransaction setValue:[NSNumber numberWithFloat:0.5f] forKey:kCATransactionAnimationDuration]; 

newView.layer.frame = CGRectMake(20,20,220,220); 

[CATransaction commit]; 
} 

それはアプリケーションがロードするとすぐに0.5秒間アニメーション化する赤い四角形を作成する必要があります。問題はアニメーション化されないということです。なぜ私は理解できません。私はこの単純なプロジェクトを作成してすべての変数を分離しましたが、まだ動作しません。

Core-Animationの読書資料の正しい方向を教えてくれる人がいますか?私はすでにAppleのすべてのものを手に入れました。

答えて

5

CALayerでプロパティを設定していた場合(デフォルトでアニメーション化されている)、コードは期待どおりにアニメートされます。オブジェクトのグループのためのアニメーションを、彼らが調整されているように、

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1.0f]; 

// Change properties here 

[UIView commitAnimations]; 

CATransactionsは、グループのアニメーションに使用されている、または手動で無効にします。UIViewsアニメーション化するためには、以下のようなブロック内でそのプロパティを変更する必要があります。

+1

「newView.layer.frame = CGRectMake(20,20,220,220);」という行はありません。ありますか? 'layer'プロパティは、UIViewのCALayerにアクセスします。それはそれをアニメートする必要があります、正しい? – mazniak

+0

あなたが正しいです、私はその行を誤解しました。その場合、あなたがやっていることはアニメーション化する必要があります。 UIViewのbegin/commitアニメーションブロックを使用するのはちょっときれいですが、同じように動作するはずです。 –

+2

私が考えていることは、新しいサブビューを追加した後、アニメーションをトリガーする前に、実行ループが終了しないということです。したがって、ビューを最後の位置に配置するだけです。アニメーションコードを別のメソッドに移動し、performSelector:withObject:afterDelay:を使用してそのメソッドをトリガーしてみましょう。遅延時間は0.01秒です。これは、サブビューが追加された後にアニメーションを有効にするはずです。 –

関連する問題