2016-10-20 5 views
1

私のアプリはビューAがビューBのスーパービューであり、ビューBの制約を設定すると、ビューAの幅の3分の1になります。方法updateConstraintsで、回転を行うとき、私はビューAのクラスにおいてスクリーンを回転させた後の幅と高さの値を更新する方法は?

-(void)updateConstraints { 
    //set the constraints of the width of view B is one-third of view A's width 
} 

方法でコードを書くビューB、
のクラスでは、私はこの方法を

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 

    [viewB setNeedsUpdateConstraints] 
    [viewB updateConstraintsIfNeeded]; 

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 
} 

をオーバーライドビューBのクラスが呼び出されますが、ビューAの幅は依然として古い値です。
希望する値は、画面を回転させた後のビューAの幅の新しい値です。

  1. :それは、私は以下のように2つの質問があり、ビューA.

    の幅の古い値に依存するため
    それは、ビューBの幅の制約が生じたが間違っています

    画面を回転した後に更新された幅/高さの値を取得する方法は?

  2. Appleのドキュメントによると、[viewA updateConstraintsIfNeeded]を呼び出すと、それ自身の制約が更新され、すべてのサブビューが更新されます。
    しかし、実際には、ビューB'class - クラスAのサブビュー - が呼び出されるメソッドupdateConstraintsが呼び出されません。どうしてか分かりません?

答えて

0

方法は、ビューの回転がまだ起こっていないことを意味ウィル TransitionToSize :,と呼ばれています。フレーム値はその時点で古いサイズになります。渡されたサイズの値を保存し、それを使用することができます。それは最終的なサイズになるからです。 updateConstraintsはローテーション中に自然に呼び出す必要があります。特に強制的にupdateConstraintsIfNeededを呼び出さないでください。

ただし、制約値の計算の一部としてビューのフレーム幅を使用しようとしている場合は、既にオフトラックしています。制約の全ポイントは、それらの等式の解がすべてのビューのフレームをもたらすことである。その方程式の答えを使って最初に方程式を設定することはできません。フレームを計算する前に制約を設定する必要があるため、永久に古い値を使用します。画面上のすべてのビューは同時に計算されます。ほとんどの場合、フレーム値を使用して制約を設定しようとするたびに、問題が発生します。今はいつもあなたは幸運になることができますが、お勧めしません。

ただし、必要な関係(ビューBはビューAの幅の1/3です)で制約を設定するのは簡単で、他の操作はプログラムでは行いません。 2つが等しい幅で、1/3の乗数で制約を設定するだけです。

[viewB.widthAnchor constraintEqualToAnchor:viewA.widthAnchor multiplier:1.0/3.0].active = YES;

あなたはまた、IBで簡単に行うことができます。スーパービューの幅に等しくなるようにviewBの制約を追加してから、制約を編集して乗数として「1/3」を加算します。コードなしで目標を達成する必要があります。

関連する問題