Not registered yet?
Register now! It is easy and done in 1 minute and gives you access to special discounts and much more!
I want to move one view on top of another, how can I know the z index of the view, and how to move on to top?
We can use zPosition in ios
if we have a view named salonDetailView
eg : @IBOutlet weak var salonDetailView: UIView!
@IBOutlet weak var salonDetailView: UIView!
In my case see the image
and have UIView for GMSMapView
eg : @IBOutlet weak var mapViewUI: GMSMapView!
@IBOutlet weak var mapViewUI: GMSMapView!
To show the View salonDetailView upper of the mapViewUI
use zPosition as below
salonDetailView.layer.zPosition = 1
please post photos and code directly here in your answer, to make it easier for OP to get it.
as a beginner, StackOverflow will not allow me to do that sorry. you can check the problem image i.stack.imgur.com/d9Cx3.png
IB and Swift
Given the flowing layout where yellow is the superview and red, green, and blue are sibling subviews of yellow,
the goal is to move a subview (let's say green) to the top.
In the Interface Builder all you need to do is drag the view you want showing on the top to the bottom of the list in the Documents Outline.
Alternatively, you can select the view and then in the menu go to Editor > Arrange > Send to Front.
There are a couple of different ways to do this programmatically.
An array of the subviews is contained in yellowView.subviews. Here, bringSubviewToFront moves the greenView from index 0 to 2. This can be observed with
greenView.layer.zPosition = 1
thanks for this... i spent 8 hours trying to figure this out. yellowView.bringSubviewToFront(greenView) worked perfectly.
Interestingly, container views do not respect this! You have to manually move them in code, it seems.
Within the view you want to bring to the top...
[parentView bringSubviewToFront:view] ;
If you are using cocos2d, you may see an issue with [parentView bringSubviewToFront:view], at least it was not working for me. Instead of bringing the view I wanted to the front, I send the other views back and that did the trick.
[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)];
You can use the zPosition property of the view's layer (it's a CALayer object) to change the z-index of the view.
theView.layer.zPosition = 1;
As Viktor Nordling added, "big values are on top. You can use any values you want, including negative values." The default value is 0.
You need to import the QuartzCore framework to access the layer. Just add this line of code at the top of your implementation file.
Just as a helper, big values are "on top". You can use any values you want, including negative values.
This solution is better in case you want your view to be always on top. Just set zPosition to MAXFLOAT
I've just learned that the zPosition of the layer, and the UIView's input handler, are on two different Z-orders. It's really odd when your clicks "pass through"
does the views' superview have to be the same in order to make zPosition works?
Just got weird behaviour with transparency and rendering, my on-top view was blinking with some chunks of UILabel at the bottom, the thing was that I used CGFLOAT_MAX for zPosition. MAXFLOAT fixed this for me.
I noticed that, even though the view is on top, clicks go through it to objects underneath. This ought to be considered a bug. I am trying to find a general way to avoid that problem, without having to explicitly disable user interactions of any views that happen to be underneath.
@BrucePatin yes it seems the responder chain is not affected by this, did you find a solution? I need the view on top to be interactive :/
Using _view.Layer.ZPosition = float.MinValue; did not put the view behind items on my storyboard. I had to use View.SendSubviewToBack(_view); for that.
_view.Layer.ZPosition = float.MinValue;
If you want to do this through XCode's Interface Builder, you can use the menu options under Editor->Arrangement. There you'll find "Send to Front", "Send to Back", etc.
UIView siblings are stacked in the order in which they are added to their superview. The UIView hierarchy methods and properties are there to manage view order. In UIView.h:
@property(nonatomic,readonly) UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;
- (void)addSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;
- (void)bringSubviewToFront:(UIView *)view;
- (void)sendSubviewToBack:(UIView *)view;
The sibling views are ordered back to front in the subviews array. So the topmost view will be:
and bottom view will be:
Like Kolin Krewinkel said, [parentView bringSubviewToFront:view] will bring the view to the top, but this is only the case if the views are all siblings in the hierarchy.