2

私は子供としてUIViewController別のものに追加する を持っています。UIViewController子が追加されると、親は を使用して子にフレームを設定しますchildVC.frame = ....が、これは私の制約を混乱させます。

IB でこの問題を簡単に再現できます。を作成しUIViewController、サイズを「フリーフォーム」に変更し、ステータス バーを非表示にします (視覚的に正しく見えるようにするためです)。(または何か)と制約を追加して、UIButton両方が同じサイズになるようにします(下の画像を参照) ここに画像の説明を入力

ここで、View Controller のトップ レベル ビューのサイズを変更し、何が起こるかを確認します。 ここに画像の説明を入力

それは私に対する私の制約を変えました。ボタンを大きくして、元の制約を保持したかったのです。画面で iPhone Retina 3.5/4.0 を切り替えたり、横向きから縦向きに変更したりすると、自動的に発生します。しかし、なぜビューのサイズを変更しないのでしょうか? これは、フリーフォームで物をレイアウトし、さまざまなサイズをテストするのに非常に苦労しています。

さらに重要なことに、VC の子を追加するときに in コードを設定するとまったく同じことが起こるのはなぜframeですか?どうすればそれを防ぐことができますか?

4

1 に答える 1

1

フレームベースの計算と自動レイアウトは互換性がありません。または少なくとも、それらは嵐の海を意味します。それがあなたが問題を抱えている理由です。自動レイアウトに切り替えたので、直接操作しなくなったことを受け入れる必要がありますframe

だから、あなたはできませんchildVC.frame = whatever

代わりに、Auto Layout を使用して のサイズを更新する必要がありますchildVC.frameIBOutletの幅制約であるIB-an を作成することにより、これを行いchildVCます。同様に、高さの制約IBOutletである別のものを作成します。childVC

ビュー コントローラーで、constant値を更新してサイズを変更します。

myWidthConstraint.constant = 123.f;

これを行う場所は、コントローラーのupdateViewConstraintsメソッド、またはビューの場合ですupdateConstraints

とはいえ、プログラムによる更新が不要になるように、自動レイアウトを設定することをお勧めします。適切に定義されると、ビューの境界が変更された場合の処理​​方法がわかります。正直なところ、もっと珍しいことをしたい場合にのみ、プログラムでサイズを更新する必要があります。

ただ、あなたの方が優れていると言えますか

于 2013-07-11T15:38:46.963 に答える