サブビューを削除すると、そのサブビューに関連するすべての制約が失われます。後でサブビューを再度追加する必要がある場合は、そのサブビューに制約を再度追加する必要があります。
通常、カスタムサブビューで制約を作成します。たとえば:
-(void)updateConstraints
{
if (!_myLayoutConstraints)
{
NSMutableArray *constraints = [NSMutableArray array];
// Create all your constraints here
[constraints addWhateverConstraints];
// Save the constraints in an ivar. So that if updateConstraints is called again,
// we don't try to add them again. That would cause an exception.
_myLayoutConstraints = [NSArray arrayWithArray:constraints];
// Add the constraints to myself, the custom subview
[self addConstraints:_myLayoutConstraints];
}
[super updateConstraints];
}
updateConstraints
は、自動レイアウトランタイムによって自動的に呼び出されます。上記のコードは、カスタムサブクラスUIView
にあります。
あなたは、Autolayoutで作業する場合、フレームサイズに触れたくないと思います。代わりに、制約をupdateConstraints
に更新してください。あるいは、より良いことに、制約を設定して、そうする必要はありません。
は、そのトピックに私の答えを参照してください:
Autolayout UIImageView with programatic re-size not following constraints
あなたが最初のフレームを設定する必要はありません。 initWithFrame
を使用する場合は、CGRectZero
に設定してください。制約は実際にはでなければなりません - 何かがどれくらいの大きさであるか、またはランタイムがサイズを推測できる他の関係のいずれかの詳細。
たとえば、ビジュアルフォーマットが@"|-[myView]-|"
の場合、水平ディメンションに必要なものはすべてです。 Autolayoutは、myView
のサイズが|
と表示されている親の範囲superview
までであることを知ります。すごいかっこいい。
ありがとうございました。それは素晴らしく、はっきりしています。私がココアについて触れたのはココアタッチではなく、他の人には注釈を付けるということです(API AmmonのPeter Ammon氏によると同じです)。両方の世界のアプローチは同じでなければなりません。 – uchuugaka
はい私はそれを逃した申し訳ありません。良い点 –
[ドキュメント](https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints)に**あなたの実装の最後のステップとして '[super updateConstraints]'を呼び出すことは重要です**。それはあなたの方法の終わりに始まり、最初ではありません。 – Eric