How to add a view behind other view in iOS

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)


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.


try sendSubviewToBack

[self.view sendSubviewToBack:leftPanelView];

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)

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];

In Swift 5

self.view.sendSubviewToBack(leftPanelView)