重新排序UIView子视图

eri*_*ell 10 layer uiview ios subviews

在我的应用程序中,我正在尝试将子视图添加到前面,然后将其放回到其原始图层位置.代码应该非常简单:

要将子视图放在前面(在我的自定义UIView类中):

[self.superview bringSubviewToFront:self];
Run Code Online (Sandbox Code Playgroud)

简单.我将原始z位置存储在一个名为的实例变量中,你猜对了zPosition.所以,前面的行-bringSubviewToFront:是:

zPosition = [self.superview.subviews indexOfObject:self];
Run Code Online (Sandbox Code Playgroud)

所以,我用来将子视图放在前面的所有代码都是:

zPosition = [self.superview.subviews indexOfObject:self];
[self.superview bringSubviewToFront:self];
Run Code Online (Sandbox Code Playgroud)

这应该是正常的.问题是当我尝试将子视图放回原位时.我只是这样做:

[self.superview exchangeSubviewAtIndex:zPosition withSubviewAtIndex:
    [self.superview.subviews indexOfObject:self]];
Run Code Online (Sandbox Code Playgroud)

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

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

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

AW1*_*101 11

exchangeSubviewAtIndex可能会将视图放回正确的位置,但它也会在顶部交换另一个视图,这不是您开始使用的视图.您可能需要执行类似这样的操作而不是exchangeSubviewAtIndex:

[self retain];
UIView *superview = self.superview;
[self removeFromSuperview];
[superview insertSubview:self atIndex:zPosition];
[self release];
Run Code Online (Sandbox Code Playgroud)


dav*_*d72 10

无需从superview中删除:

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