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]];

使用此代码,如果我有两个子视图,则会发生以下情况:

假设我有视图 A 和视图 B。视图 A 在视图 B 上方。我点击视图 B,它来到前面。我再次点击视图 B(它应该回到原来的位置),没有任何反应,所以它现在在视图 A 上。如果我现在点击视图 A,它会出现在前面,但是当我再次点击它时(所以它应该回到它原来的 z 位置:在视图 B)下面,它的所有兄弟视图都消失了!

有谁看到可能导致此问题的原因?

4

4 回答 4

12

无需从 superview 中删除:

[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 回答
2

[快速解决方案]

正如其他人所说,没有必要删除并重新添加您的子视图。

相反,我发现最方便的方法是:

superView.insertSubview(subviewYouWantToReorder, aboveSubview: subviewWhichShouldBeBelow)
于 2018-05-01T10:24:33.497 回答
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 回答