2011-10-27 15 views
13

親UIのビュー(下のコードで使用されているUILabel)の親UIViewがあり、そのフレームは親の境界に設定されていて、autoresizingMaskは、高さ:このアニメーションIの結果親UIViewのフレーム(サイズ)をアニメーション化するときのUILabelの自動サイズ調整

[UIView animateWithDuration:1.0 animations:^{ parentView.frame = CGRectMake(0, 0, 160, 240); }]; 

:私は具体的には、そのサイズを親ビューのフレームをアニメーション化し、サブビューは、アニメーションの一部として、サイズを変更していことができるようにしたい

UIView* parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
UILabel* childLabel = [[UILabel alloc] initWithFrame:parentView.bounds]; 
childLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
childLabel.textAlignment = UITextAlignmentCenter; 
childLabel.text = @"Hello"; 

UILabelのテキストを親ビューのa視覚的に見ると、テキストが(160,240)から(80,120)の中央に移動するのが視覚的にわかります。しかし、アニメーション化する代わりに、サブビューのフレームがアニメーションの最後にあるべき値に設定されているので、アニメーションの開始時にテキストの位置がすぐにジャンプすることがわかります。

サブビューをアニメーションの一部として自動サイズ調整する方法はありますか?

答えて

20

何が起こっているのか私の頭が完全にはわかりませんが、UIKitはアニメーションのフレームごとにテキストを再レンダリングする必要がないため、UILabelのコンテンツアニメーション化できません。デフォルトでは、UILabelのcontentModeプロパティはUIViewContentModeRedrawです。つまり、プロパティが設定されるとすぐにターゲットサイズでUILabelを再描画します。

contentModeをUIViewContentModeCenterに変更すると、コンテンツは再描画されず、UILabelの中央に残ります。

childLabel.contentMode = UIViewContentModeCenter; 
+1

これは素晴らしい情報です。 UIViewContentModeCenterは、実際に必要なもの、つまり、親ビューのフレームが縮小または拡大している間にテキストを中央に置くために必要なものに対して機能します。ありがとう。 –

+0

偉大な!ありがとう! – Kjuly

関連する問題