0

ユーザーのアクションに応じてサブビューのフレームを動的に変更する必要があるビューがあります。ビューが読み込まれると、次のようにサブビューを初期化します。

if (self.firstSubview == nil) {
    NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"FirstSubView" owner:self options:nil];
    for (UIView *view in views) {
        self.firstSubview = view;
    }
}

その後:

[self.view addSubview:self.firstSubview];

初期化したら、サブビューのフレームを変更したい場合は、次のようにします。

self.firstSubview.frame = CGRectMake(0, 80, self.firstSubview.frame.size.width, 200);

私がやりたいことは、ユーザーがボタンをタップしたときにサブビューの Y 座標とその高さを調整し、ユーザーがボタンをもう一度タップしたときにサブビューの元のフレームを取り戻すことです。ただし、これが機能しない場合があることがわかりました.Y座標と高さは、CGRectMake関数で言うように常に設定されていないようです。関数は常に絶対値を取るとは限らず、代わりに最後のフレームの値に依存するように見えます...つまり、この関数呼び出しの後、フレームが常に Y = 80 座標を取るとは限らないようです。

多分私はこれがどのように機能するかを誤解しています: ビューのnibファイルで、私はその上と下のバーを設定したSimulated Metricsので、ビューの高さはそれらのバーの間の残りのスペースでなければならず、(0,0) 座標は左上でなければなりませんトップバーの下のコーナーですよね?足りないものはありますか?フレームを変更するたびに、サブビューを再初期化して追加する必要がありますか? または、フレームの変更を適用するために他にすべきことはありますか?

前もって感謝します

4

1 に答える 1

0

投稿した for-in ループは、配列ビューの各要素を順番に self.firstSubview プロパティに設定するため、ループの後に self.firstSubview が最後のものになります。これが本当にあなたが望むものなら、もっと簡単な方法があります:

if (views.count > 0)
    self.firstSubview = views.lastObject;

多分:

for (id element in views)
{
    if ([element isKindOfClass:[UIView class]])
    {
        self.firstSubview = element;
        break;
    }
}
于 2014-12-04T22:20:22.180 に答える