Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reordering UIView subviews

In my app I am trying bring a subview to front, then put it back to its original layer position later. The code should be pretty simple:

To bring the subview to front (inside my custom UIView class):

[self.superview bringSubviewToFront:self];

Easy. I store the original z position in an instance variable called, you guessed it, zPosition. So, the line before -bringSubviewToFront: is:

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

So, all of the code I use to bring my subview to front is:

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

This works as it should. The problem is when I try to put the subview back where it was. I'm simply doing this:

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

Using this code, if I have two subviews, this is what happens:

Let's say I have view A and view B. View A is above view B. I tap view B, it comes to the front. I tap view B again (it should go back to where it was), and nothing happens, so it's now on view A. If I now tap view A, it comes to the front, but when I tap it again (so it should go back to its original z position: below view B), all of its sibling views disappear!

Does anyone see what could be causing this problem?

like image 595
eric.mitchell Avatar asked Jul 18 '12 20:07

eric.mitchell


1 Answers

[ Swift solution ]

As other guys said, there is no need to remove and re-add your subviews.

Instead I've found that the most convenient method is:

superView.insertSubview(subviewYouWantToReorder, aboveSubview: subviewWhichShouldBeBelow)
like image 197
Ondřej Korol Avatar answered Sep 28 '22 08:09

Ondřej Korol