exchangeSubviewAtIndex

exchangeSubviewAtIndex

在我的应用程序中,我尝试将 subview 放在最前面,然后再将其放回其原始图层位置。代码应该非常简单:

要将 subview 置于最前面(在我的自定义UIView类内部):

[self.superview bringSubviewToFront:self];

简单。我将原始z位置存储在一个名为zPosition的实例变量中。因此,-bringSubviewToFront:之前的行是:
zPosition = [self.superview.subviews indexOfObject:self];

因此,我用来将 subview 置于最前面的所有代码是:
zPosition = [self.superview.subviews indexOfObject:self];
[self.superview bringSubviewToFront:self];

这可以正常工作。问题是当我尝试将 subview 放回原处时。我只是在这样做:
[self.superview exchangeSubviewAtIndex:zPosition withSubviewAtIndex:
    [self.superview.subviews indexOfObject:self]];

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

假设我有 View A和 View B。 View A在 View B上方。我点击 View B,它位于前面。我再次点击 View B(应该回到原来的位置),什么也没有发生,所以它现在在 View A上。如果现在点击 View A,它会出现在最前面,但是当我再次点击它时(因此应该返回其原始的z位置:在 View B)下,其所有同级 View 都消失了!

有人看到造成这个问题的原因吗?

最佳答案

exchangeSubviewAtIndex可能会将 View 放回正确的位置,但它也会在顶部交换另一个 View ,而这并不是您开始的。您可能需要执行以下操作,而不是exchangeSubviewAtIndex:

[self retain];
UIView *superview = self.superview;
[self removeFromSuperview];
[superview insertSubview:self atIndex:zPosition];
[self release];

07-27 15:49