2009-11-17 5 views
17

addSubviewを使用しているときに問題があります。addSubviewで追加したときにその親にビューサイズを変更する

例コード:

ParentView *myParentView = [[ParentView alloc] initWithNibName:@"ParentView " bundle:nil]; 
ChildeView *myChildeView = [[ChildeView alloc] initWithNibName:@"ChildeView" bundle:nil]; 

//... parent frame resized with setFrame lets say to x:0, y:0, W:320, H:411 

[[myParentView view] addSubview: [myChildeView view]]; 

私の子供追加親そして大きいです、そして親の境界にそのフレームのサイズを変更しません。私は親の "クリップのサブビュー"を使用することはできませんし、親フレームのサイズが再び変更されない場合、 "Autoresize Subviews"は機能しないようです。すべての子にsetFrameを使用せずに、親ビューの境界に自動的にサブビューのサイズを変更するプロパティがありますか?

答えて

30

自動レイアウトを使用していない場合は、子ビューの自動サイズ設定マスクを設定しようとしましたか?これを試してみてください:

myChildeView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
           UIViewAutoresizingFlexibleHeight); 

また、あなたは自動的にそのフレームの変更をサブビューのサイズを変更する親ビューを取得するために

myParentView.autoresizesSubviews = YES; 

を呼び出す必要があります。

親ビューのフレーム外に子ビューの描画が表示されている場合は、親ビューがそのコンテンツをクリッピングしていない可能性があります。それを修正するには、あなたは常にあなたのUIViewsで- (void)didMoveToSuperview方法でそれを行うことができます

myParentView.clipsToBounds = YES; 
+0

感謝をコピーする必要があります。しかし、なぜこれがデフォルトのUIViewの動作ではないのですか?面白いコードを作り出していますか?なぜ、クリップのサブビューが機能するのですか? – Luca

+0

子ビューを追加する前に親ビューのフレームを変更していますか? –

+0

はい、常に同じ問題が発生します。 – Luca

0

を呼び出します。親から追加または削除されたときに呼び出されます(削除されたときはnil)。その時点であなたの親のサイズにあなたのサイズを設定してください。その点から、自動サイズ調整マスクが適切に機能するはずです。

+0

受信者にスーパービューが変更されたことを通知します(可能性はありません)。それはaddSubviewで発火しないようです。 – Luca

7

親ビューのフレームを子ビューにコピーして追加するだけです。その後、自動サイズ変更が機能します。それは動作しませんが、実際にはあなただけ、サイズCGRectMake(0、0、parentView.frame.size.width、parentView.frame.size.height)答えを

childView.frame = CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height); 
[parentView addSubview:childView]; 
+0

しかし、これは自動サイズ調整ではありません。それは親ビューからのクローンです。 – lojals

+0

これが私が「その後自動サイズ調整が機能する」という理由です。あなたはXCodeのInterface Builderでこれを設定することができます。サブビューに親の内部に奇妙なジオメトリがあると、自動サイズ変更によって奇妙な結果が生成されます。 – cat

関連する問題