2013-06-21 8 views
9

autolayoutを使用しているとき、私の理解では、サブビューを削除している間に、削除されたサブビューはオートレイアウト制約を認識しています。autolayoutでサブビューを削除して再追加する

ただし、後でスーパービューに追加すると、サブビューはそのフレームサイズを認識しなくなります。 それはむしろゼロフレームを得るようです。

私は、autolayoutが制約を満たすために自動サイズ調整すると仮定しました。そうじゃないの? 私は、自動レイアウトは枠の矩形を混乱させないと考えました。オートレイアウトでも、サブビューを追加するときに、最初のフレームをrectに設定する必要がありますか?

答えて

16

サブビューを削除すると、そのサブビューに関連するすべての制約が失われます。後でサブビューを再度追加する必要がある場合は、そのサブビューに制約を再度追加する必要があります。

通常、カスタムサブビューで制約を作成します。たとえば:

-(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までであることを知ります。すごいかっこいい。

+1

ありがとうございました。それは素晴らしく、はっきりしています。私がココアについて触れたのはココアタッチではなく、他の人には注釈を付けるということです(API AmmonのPeter Ammon氏によると同じです)。両方の世界のアプローチは同じでなければなりません。 – uchuugaka

+1

はい私はそれを逃した申し訳ありません。良い点 –

+1

[ドキュメント](https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints)に**あなたの実装の最後のステップとして '[super updateConstraints]'を呼び出すことは重要です**。それはあなたの方法の終わりに始まり、最初ではありません。 – Eric