0

私は containerView と呼ばれる UIView を持っており、その中にいくつかの UILabel と UITextView があり、後でサブビューの高さを繰り返して合計することで、containerView の最終的な高さを調整しています。この高さを自動的に調整することは可能ですか? 次のようなものを使用して、サブビューの高さを調整しています。

CGFloat desiredHeight = [object.text sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:15] constrainedToSize:CGSizeMake(self.imageView_.frameWidth , CGFLOAT_MAX) lineBreakMode:UILineBreakModeClip].height;

また、特定のサブビューの y 原点を常に別のサブビューの下に調整することもできますか? たとえば、このcontainerViewには、AとBの2つのUILabelがあります。Bが常にAの下になるようにしたかったのです。

[B setFrameY:A.frameY + A.frameHeight];

自動サイズ変更マスクでこのようなことを達成することは可能ですか? 定数を使用できない理由は、A の frameHeight がテキストの長さに応じて動的であるためです。

4

1 に答える 1

0

あなたの質問に対する簡単な答えは、いいえ、サブビューに基づいてビューの自動サイズ変更はないということだと思います。後者の質問 (別のコントロールに基づいてコントロールのフレームを調整する) に関しては、 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;
于 2012-07-31T03:52:32.687 に答える