4

いくつかのサブビューを表示することになっているメインビューがあります。これらのサブビューは、(z軸で)互いに真上と真下にあり、次のコードを使用して(y軸で)ドロップダウンして上に移動します。

if (!CGRectIsNull(rectIntersection)) {
    CGRect newFrame = CGRectOffset (rectIntersection, 0, -2);
    [backgroundView setFrame:newFrame];
} else{
    [viewsUpdater invalidate];
    viewsUpdater = nil;
}

rectIntersectionは、ビューが完全に下に移動し、前面のビューの後ろになくなったとき(rectIntersectionがnullになったとき)、これがすべて繰り返しタイマー内にあるため、一度に2ピクセルずつ下に移動することを通知するために使用されます。これらの他の2つのビューを含むメインビューを下にサイズ変更して、背景のビューが下がっているのと同じように拡大するようにします。これは私がそのために試しているコードです:

CGRect mainViewFrame = [mainView frame];
if (!CGRectContainsRect(mainViewFrame, backgroundFrame)) {
    CGRect newMainViewFrame = CGRectMake(0,
                                         0,
                                         mainViewFrame.size.width,
                                         (mainViewFrame.size.height + 2));
    [mainView setFrame:newMainViewFrame];
}

mainViewにこの背景ビューが含まれているかどうかを確認するのが目的です。backgroundViewを下げると、メインビューにはそれが含まれなくなり、2ピクセル下に拡大する必要があります。これは、背景ビューの移動が停止し、mainViewに最終的にbackgroundViewが含まれるまで発生します。

問題は、mainViewのサイズがまったく変更されていないことです。背景ビューが下がっていて、mainViewの下部から消えるまで見ることができます。mainViewのサイズは変更されているはずですが、どの方向にも変更されません。setFrameとsetBounds(setNeedsDisplayの有無にかかわらず)を使用してみましたが、何も機能しませんでした。

私は本当にメインビューのサイズをプログラムで変更する方法を探しています。

4

1 に答える 1

2

問題が何であるかを理解したと思います。コードを注意深く読みました。

if (!CGRectIsNull(rectIntersection)) {
    // here you set the wrong frame
    //CGRect newFrame = CGRectOffset (rectIntersection, 0, -2);
    CGRect newFrame = CGRectOffset (backgroundView.frame, 0, -2);
    [backgroundView setFrame:newFrame];
} else{
    [viewsUpdater invalidate];
    viewsUpdater = nil;
}

rectIntersectionは、実際には 2 つのビューの交点であり、重なり合っており、backgroundView下に移動すると、長方形の高さが減少します。
そうすれば、mainView一度だけサイズが変更されます。

これに追加するために、ブロック構文を使用してビューをアニメーション化する簡単なソリューションを次に示します。このコードは通常、カスタム ビュー コントローラーで行われます。

// eventually a control action method, pass nil for direct call
-(void)performBackgroundViewAnimation:(id)sender {
    // first, double the mainView's frame height
    CGFrame newFrame = CGRectMake(mainView.frame.origin.x,
                                  mainView.frame.origin.y,
                                  mainView.frame.size.width,
                                  mainView.frame.size.height*2);
    // then get the backgroundView's destination rect
    CGFrame newBVFrame = CGRectOffset(backgroundView.frame,
                                      0,
                                      -(backgroundView.frame.size.height));
    // run the animation
    [UIView animateWithDuration:1.0
                     animations:^{
                                     mainView.frame = newFrame;
                                     backgroundView.frame = newBVFrame;
                                 }
    ];
}
于 2011-07-17T21:21:30.150 に答える