親UIViewのフレーム(サイズ)をアニメーション化するときにUILabelのフレームを自動サイズ調整する

親のUIView(下のコードで使用されるUILabel)の親UIViewがあり、そのフレームは親の境界に設定され、autoresizingMaskは幅と高さが可変に設定されています。

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";

親ビューのフレーム、特にそのサイズをアニメーション化し、サブビューのサイズをアニメーションの一部として持たせたいと考えています:

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

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

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

14

1 答え

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

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

childLabel.contentMode = UIViewContentModeCenter;
20
追加された
十分に素晴らしい!ありがとう!
追加された 著者 Kjuly,
それは素晴らしい情報です。 UIViewContentModeCenterは、実際に必要なもの、つまり、親ビューのフレームが縮小または拡大している間にテキストを中央に置くために必要なものに対して機能します。ありがとう。
追加された 著者 Shane Arney,