64

I am working on integrating an ad provider into my app currently. I wish to place a fading message in front of the ad when the ad displays but have been completely unsuccessful.

I made a function which adds a subview to my current view and tries to bring it to the front using

[self.view bringSubviewToFront:mySubview]

The function fires on notification that the ad loaded (the notification is from the adprovider's SDK). However, my subview does not end up in front of the ad. I imagine this is made purposely difficult by the ad provider, but I wish to do it regardless. I am currently discussing with the provider whether or not this can be allowed. But for the time being, I just want to see if it's even possible.

Is there anyway I can force a subview of mine to be the top-most view such that it will not be obstructed by anything?

Mark S
  • 2,161
  • 3
  • 21
  • 25

8 Answers8

179

try this:

self.view.layer.zPosition = 1;
daniel kilinskas
  • 3,538
  • 3
  • 16
  • 10
90

What if the ad provider's view is not added to self.view but to something like [UIApplication sharedApplication].keyWindow?

Try something like:

[[UIApplication sharedApplication].keyWindow addSubview:yourSubview]

or

[[UIApplication sharedApplication].keyWindow bringSubviewToFront:yourSubview]
jere
  • 4,306
  • 2
  • 27
  • 38
23

Swift 2 version of Jere's answer:

UIApplication.sharedApplication().keyWindow!.bringSubviewToFront(YourViewHere)

Swift 3:

UIApplication.shared.keyWindow!.bringSubview(toFront: YourViewHere)

Swift 4:

UIApplication.shared.keyWindow!.bringSubviewToFront(YourViewHere)

Hope it saves someone 10 seconds! ;)

Sharad Paghadal
  • 2,089
  • 15
  • 29
Paul Lehn
  • 3,202
  • 1
  • 24
  • 29
  • What if I want to bring the keyWindow itself to the front ? I am facing an issue where the keyWindow stays on the back for some reason... – Jesus Rodriguez Jul 13 '17 at 19:16
18

I had a need for this once. I created a custom UIView class - AlwaysOnTopView.

@interface AlwaysOnTopView : UIView
@end

@implementation AlwaysOnTopView

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (object == self.superview && [keyPath isEqual:@"subviews.@count"]) {
        [self.superview bringSubviewToFront:self];
    }

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

- (void)willMoveToSuperview:(UIView *)newSuperview {
    if (self.superview) {
        [self.superview removeObserver:self forKeyPath:@"subviews.@count"];
    }

    [super willMoveToSuperview:newSuperview];
}

- (void)didMoveToSuperview {
    [super didMoveToSuperview];

    if (self.superview) {
        [self.superview addObserver:self forKeyPath:@"subviews.@count" options:0 context:nil];
    }
}

@end

Have your view extend this class. Of course this only ensures a subview is above all of its sibling views.

rmaddy
  • 314,917
  • 42
  • 532
  • 579
8

As far as i experienced zposition is a best way.

self.view.layer.zPosition = 1;

Gobi M
  • 3,243
  • 5
  • 32
  • 47
2

Let me make a conclusion. In Swift 5

You can choose to addSubview to keyWindow, if you add the view in the last. Otherwise, you can bringSubViewToFront.

let view = UIView()
UIApplication.shared.keyWindow?.addSubview(view)
UIApplication.shared.keyWindow?.bringSubviewToFront(view)

You can also set the zPosition. But the drawback is that you can not change the gesture responding order.

view.layer.zPosition = 1
Zgpeace
  • 3,927
  • 33
  • 31
1

In c#, View.BringSubviewToFront(childView); YourView.Layer.ZPosition = 1; both should work.

0

In Swift 4.2

UIApplication.shared.keyWindow!.bringSubviewToFront(yourView)

Source: https://developer.apple.com/documentation/uikit/uiview/1622541-bringsubviewtofront#declarations

Vinoth Vino
  • 9,166
  • 3
  • 66
  • 70
  • 1
    No they changed in Swift 4.2, Please have a look at https://developer.apple.com/documentation/uikit/uiview/1622541-bringsubviewtofront#declarations @LuigiTaira – Vinoth Vino Nov 13 '18 at 09:16