How to add a view behind other view in iOS

IphoneIosViewCore Animation

Iphone Problem Overview


I want to add a view under my tab bar analog in iOS and then show it with animation coming from behind it. But when I use my code, the view that must come from behind my tab bar overlaps my tab bar for a while.

tab bar and a view that shows when tab bar button pressed

This is my code:

- (void)handlePressedButton {
if (pressedButton.selected) {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    CGAffineTransform transform1 = CGAffineTransformMakeTranslation(-196.0, 0.0);
    CGAffineTransform transform2 = CGAffineTransformMakeTranslation(0.0, 0.0);
    [leftPanelView setTransform:transform1];
    [movedView setTransform:transform2];
    [UIView commitAnimations];
    pressedButton.selected = NO;
}
else {
    pressedButton.selected = YES;
    if (leftPanelView) {
        [leftPanelView removeFromSuperview];
        leftPanelView = nil;
    }
    CGRect viewFrame = CGRectMake(-196, 0, 236, 748);
    leftPanelView = [[UIView alloc] initWithFrame:viewFrame];
    leftPanelView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"left-nav-content.png"]];
    
    // Code to populate leftPanelView according to what button is pressed.
    [self populateLeftPanelView];
    
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [self.view addSubview:leftPanelView];
    CGAffineTransform transform1 = CGAffineTransformMakeTranslation(236.0, 0.0);
    CGAffineTransform transform2 = CGAffineTransformMakeTranslation(112.0, 0.0);
    [leftPanelView setTransform:transform1];
    [movedView setTransform:transform2];
    [UIView commitAnimations];
}

}

Here the leftPanelView is the view that must come under a tab bar. Moved view is another view, that is at the right of left panel (don't mind it)

Iphone Solutions


Solution 1 - Iphone

Besides addSubview, there are other methods you can rely on to add your view:

 insertSubview:aboveSubview:
 insertSubview:belowSubview:
 insertSubview:atIndex:

You can control the index (actually z-index, or layer order) of the view using these methods.

Solution 2 - Iphone

try sendSubviewToBack

[self.view sendSubviewToBack:leftPanelView];

Solution 3 - Iphone

Swift 5

Insert a view below another view in the view hierarchy:

view.insertSubview(subview1, belowSubview: subview2)

Insert a view above another view in the view hierarchy:

view.insertSubview(subview1, aboveSubview: subview2)

Insert a subview at the specified index:

view.insertSubview(subview, at: index)

Move the specified subview so that it appears behind its siblings:

subview1.sendSubviewToBack(subview2)

Move the specified subview so that it appears on top of its siblings:

subview1.bringSubviewToFront(subview2)

Exchange the subviews at the specified indices:

view.exchangeSubview(at: index1, withSubviewAt: index2)

Solution 4 - Iphone

Oh, I found a solution myself. I added after this:

[UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [self.view addSubview:leftPanelView];

this line:

[self.view sendSubviewToBack:leftPanelView];

Solution 5 - Iphone

In Swift 5

self.view.sendSubviewToBack(leftPanelView)

Solution 6 - Iphone

Another nice idea is to give the Subviews a tag.

Swift

mainView.addSubView(topView)
mainView.addSubView(bottomView)

topView.tag = 2

mainView.insertSubview(bottomView, belowSubview: mainView.viewWithTag(2))

Solution 7 - Iphone

Objective-C

Insert a view below another view in the view hierarchy:

- (void)insertSubview:(UIView *)subview1 
         belowSubview:(UIView *)subview2;

Insert a view above another view in the view hierarchy:

- (void)insertSubview:(UIView *)subview1 
         aboveSubview:(UIView *)subview2;

Insert a subview at the specified index:

- (void)insertSubview:(UIView *)view 
              atIndex:(NSInteger)index;

Move the specified subview so that it appears behind its siblings:

- (void)sendSubviewToBack:(UIView *)view;

Move the specified subview so that it appears on top of its siblings:

- (void)bringSubviewToFront:(UIView *)view;

Exchange the subviews at the specified indices:

- (void)exchangeSubviewAtIndex:(NSInteger)index1 
            withSubviewAtIndex:(NSInteger)index2;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDenis KutlubaevView Question on Stackoverflow
Solution 1 - IphoneHe ShimingView Answer on Stackoverflow
Solution 2 - IphoneaderView Answer on Stackoverflow
Solution 3 - IphonexmasalovView Answer on Stackoverflow
Solution 4 - IphoneDenis KutlubaevView Answer on Stackoverflow
Solution 5 - IphoneVinoth VinoView Answer on Stackoverflow
Solution 6 - IphonemyraView Answer on Stackoverflow
Solution 7 - IphonexmasalovView Answer on Stackoverflow