2013-06-10 8 views
10

私は非常に単純なタスクで奇妙な問題があります。 > A UILabelとシンプルなUIViewの - 私たちは2つのサブビューを持つ親ビューを持っている上記の例ではAutoLayoutとUILabelのサイズ変更アニメーションがデバイスの回転で正しく機能しない

|--------------------------------------| 
|    Parent View    | 
|          | 
||------------------------------------|| 
||    UILabel    || 
||------------------------------------|| 
|          | 
|          | 
||------------------------------------|| 
||    UIView    || 
||------------------------------------|| 
|          | 
|          | 
|--------------------------------------| 

は私が問題を再現するために、非常に小さなセットアップを必要とします。イムは、上記のようなレイアウトに適用する自動レイアウトを使用して:

Constraints for UILabel: 
Leading Space to superview = 0 
Trailing Space to superview = 0 
Fixed Height constraint (e.g. 80pt) 
Top Space constraint (e.g. 50pt) 

The UIView subview has the same constraint types (the values for height and top space differs). 

をだから私は、このセットアップを期待するもの、私たちが先頭とスペースを末尾がゼロであることを定義し、両方のサブビューは、親の全幅を採用することです。そのため、親ビューの幅を変更すると、サブビューの幅も変更されて整列したままになります。

親ビューの寸法が200x400 ptであるとします。肖像画で私のサンプルをビルドして実行すると、すべてが正常に見えます。私が風景に回転するとき、すべてはまだよく見える。親ビューの幅とサブビューの幅さえも大きくなりました。しかし、今私は戻っ肖像画に回転するときuilabelsは、直ちにそのターゲットの幅は任意のアニメーションなしで取得します幅:

|--------------------------------------| 
|    Parent View    | 
|          | 
| (immediately has target size)  | 
|   |--------------|   | 
|   | UILabel |   | 
|   |--------------|   | 
|          | 
| (this subview is still    | 
|    animating its width)  | 
| |------------------------------| | 
|-->|   UIView    |<--| 
| |------------------------------| | 
|          | 
|          | 
|--------------------------------------| 

を親ビューの幅とUIViewのサブビュー幅が適切にアニメーション化されます。その奇妙な振る舞いを持つ唯一のユーラベルです。その問題を引き起こす原因を見つけることはできません。

+0

階層と制約をプログラムで作成していますか?その場合は、translatesAutoresizingMaskIntoConstraintsをNOに設定してください。 –

+0

あなたはこれを理解しましたか?私は同じ問題を抱えている – user18853

答えて

0

問題は、UILabelがサイズ変更をアニメーション化していないが、テキストがアニメーション化されていないということではありません。ラベルに異なる背景色を付ける場合は、実際にアニメーション化されていることがわかります。これは、位置にジャンプするテキストだけです。

これを解決する方法の1つは、アニメーションのないラベルの幅を変更し、Xポイントで移動させることです(Xは開始幅と終了幅の差の半分で、その位置をアニメーションします)。

あなたのコードに対してこの方法で唯一問題となるのは、私があなたが自動レイアウトでそれを行うことができるとは思わないということです。

0

私が覚えているように、制約のためにいくつかの仕様を追加する必要がありますが、このような簡単なUI要素に対してはUIViewAutoresizingマスクを使用することをお勧めします。それらははるかに単純であり、定義が短くなっています。あなたの場合はUIViewAutoresizingFlexibleWidthを使用してください。

0

autolayoutstory boardに設定することをお勧めします。制約を設定するときに、View Controllerですべてのサブビューが選択されていることを確認してください。そのために、あなたは、次の操作を行う必要があります:あなたのメインビューコントローラのビューに

  1. クリックし
  2. 押しCtrl+A
  3. クリックして解決自動レイアウトの問題
  4. 選択あなたのビューコントローラに欠落している制約を追加

次に、すべてのサブビューに制約が設定され、回転中に完全に機能します。

1

私の提案は、次のとおりです。

あなたは親ビューが- (void)layoutSubviewsを使用してサブクラス化した場合:

- (void)layoutSubviews { 
    label.frame = CGRectMake(leftInset, labelY, parentView.frame.size.width - leftInset*2, labelHeight); 
    childView.frame = CGRectMake(leftInset, childViewY, parentView.frame.size.width - leftInset*2, childHeight); 
} 

あなたがautoresizingMaskを使用することができ、親ビューをサブクラス化していない場合:

label.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
childView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
関連する問題