あなたの質問に対する簡単な答えは、いいえ、サブビューに基づいてビューの自動サイズ変更はないということだと思います。後者の質問 (別のコントロールに基づいてコントロールのフレームを調整する) に関しては、 WWDC 2012のさまざまな「自動レイアウト」ビデオを確認する必要があります。
私が最初にこれに答えたとき、あなたの質問を読み直したときに、あなたがすでに実装していると思う解決策を提供しただけかもしれないと思います。謝罪いたします。とにかく、参考のために私の古い答えを含めます。
古い答え:
最初の質問では、いいえ、サブビューを繰り返し処理して、目的を達成する必要があると思います。自動サイズ調整マスクでは何もできないと思います(これらは逆に設計されており、スーパービューの境界の変更に基づいてサブビューのフレームを調整します)。そして、iOS 6 はいくつかの機能強化を約束しているが、私はそれがあなたの特定の課題に取り組むとは思わない.
ただし、プログラムでかなり簡単に何かを実行できることは明らかです。次のようなことができます。
- (void)resizeView:(UIView *)view
{
CGSize maxSize = CGSizeMake(0.0, 0.0);
CGPoint lowerRight;
// maybe you don't want to do anything if there are no subviews
if ([view.subviews count] == 0)
return;
// find the most lowerright corner that will encompass all of the subviews
for (UIView *subview in view.subviews)
{
// you might want to turn off autosizing on the subviews because they'll change their frames when you resize this at the end,
// which is probably incompatible with the superview resizing that we're trying to do.
subview.autoresizingMask = 0;
// if you have containers within containers, you might want to do this recursively.
// if not, just comment out the following line
[self resizeView:subview];
// now let's see where the lower right corner of this subview is
lowerRight.x = subview.frame.origin.x + subview.frame.size.width;
lowerRight.y = subview.frame.origin.y + subview.frame.size.height;
// and adjust the maxsize accordingly, if we need to
if (lowerRight.x > maxSize.width)
maxSize.width = lowerRight.x;
if (lowerRight.y > maxSize.height)
maxSize.height = lowerRight.y;
}
// maybe you want to add a little margin?!?
maxSize.width += 10.0;
maxSize.height += 10.0;
// adjust the bounds of this view accordingly
CGRect bounds = view.bounds;
bounds.size = maxSize;
view.bounds = bounds;
}
サブビューに基づいてサイズを変更したい「コンテナ」ビューでそれを呼び出すだけです(おそらく、これを別の獣である適切なView Controllerコンテインメントと混同しないことが最善です)。サイズを調整するだけであることに注意してください(サブビューやビューも移動したくない場合は、origin
必要に応じて簡単に行うことができます)。これも再帰的に行いましたが、やりたくないかもしれません。あなたの電話。
2 番目の質問では、ラベル B をラベル A の下に移動するのは非常に簡単です。
CGRect frame = b.frame;
frame.origin.y = a.frame.origin.y + a.frame.size.height;
b.frame = frame;