10

私のアプリでは、サブビューを前面に出し、後で元のレイヤー位置に戻そうとしています。コードは非常に単純です。

サブビューを前面に表示するには (カスタム UIView クラス内):

[self.superview bringSubviewToFront:self];

簡単。元の z 位置を、ご想像のとおり、 というインスタンス変数に格納しますzPosition。したがって、前の行-bringSubviewToFront:は次のとおりです。

zPosition = [self.superview.subviews indexOfObject:self];

したがって、サブビューを前面に表示するために使用するすべてのコードは次のとおりです。

zPosition = [self.superview.subviews indexOfObject:self];
[self.superview bringSubviewToFront:self];

これは正常に機能します。問題は、サブビューを元の場所に戻そうとしたときです。私は単にこれをやっています:

[self.superview exchangeSubviewAtIndex:zPosition withSubviewAtIndex:
    [self.superview.subviews indexOfObject:self]];

このコードを使用すると、2 つのサブビューがある場合、次のようになります。

ビュー A とビュー B があるとします。ビュー A はビュー B の上にあります。ビュー B をタップすると、前面に表示されます。ビュー B をもう一度タップしても (元の場所に戻るはずです)、何も起こらないので、ビュー A になっています。ここでビュー A をタップすると、前面に表示されますが、もう一度タップすると (そうする必要があります)元の z 位置に戻ります: ビュー B の下)、その兄弟ビューはすべて消えます!

この問題を引き起こしている可能性のあるものを誰かが見ていますか?

4

4 に答える 4

12

スーパービューから削除する必要はありません:

[self.superview insertSubview:self atIndex:zPosition];

于 2014-07-07T23:44:39.743 に答える
11

exchangeSubviewAtIndex は、ビューを適切な場所に戻す可能性がありますが、別のビューを一番上にスワップすることもあり、これは最初からのものではありません。exchangeSubviewAtIndex の代わりに、次のようなことが必要になる場合があります。

[self retain];
UIView *superview = self.superview;
[self removeFromSuperview];
[superview insertSubview:self atIndex:zPosition];
[self release];
于 2012-07-18T21:10:35.547 に答える
0

この質問と回答は私にとって非常に役に立ちました。

ビューがオーバーレイの上と下にあるビュースタックの間にオーバーレイを配置する必要があり、それを動的に保ちたいと思いました。つまり、ビューはそれが隠されているかどうかを知ることができます。

次のアルゴリズムを使用してビューを並べ替えました。「ビューを削除する必要はありません」については、以下のAW101に感謝します。

これが私のアルゴリズムです:

- (void) insertOverlay {

    // Remember above- and belowcounter
    int belowpos = 0, abovepos = 0;

    // Controller mainview
    UIView *mainview = [self currentMainView];

    // Iterate all direct mainview subviews
    for (UIView* view in mainview.subviews) {
        if ([self isAboveOverlay:view]) {
            // Re-insert as aboveview
            [mainview insertSubview:view atIndex:belowpos + (abovepos++)];
        }
        else {
            // Re-insert as belowview
            [mainview insertSubview:view atIndex:belowpos++];
        }
    }

    // Put overlay in between above and below.
    [mainview insertSubview:_overlay atIndex:belowpos];
}
于 2016-06-03T22:25:43.397 に答える