63

我目前正在将广告提供商集成到我的应用程序中。当广告显示但完全不成功时,我希望在广告前面放置一条淡入淡出的消息。

我做了一个函数,它向我当前的视图添加一个子视图,并尝试使用它把它带到前面

[self.view bringSubviewToFront:mySubview]

该函数在广告加载通知时触发(通知来自广告提供者的 SDK)。但是,我的子视图并没有出现在广告前面。我想这是广告提供商故意让这变得困难的,但无论如何我都希望这样做。我目前正在与提供商讨论是否可以允许这样做。但就目前而言,我只是想看看这是否可能。

无论如何我可以强制我的子视图成为最顶层的视图,这样它就不会被任何东西阻挡?

4

8 回答 8

176

试试这个:

self.view.layer.zPosition = 1;
于 2015-04-02T12:09:59.353 回答
90

如果广告提供者的视图没有添加到self.view类似的东西上[UIApplication sharedApplication].keyWindow怎么办?

尝试类似:

[[UIApplication sharedApplication].keyWindow addSubview:yourSubview]

或者

[[UIApplication sharedApplication].keyWindow bringSubviewToFront:yourSubview]
于 2012-11-01T17:38:59.910 回答
22

Jere 回答的 Swift 2 版本:

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

斯威夫特 3:

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

斯威夫特 4:

UIApplication.shared.keyWindow!.bringSubviewToFront(YourViewHere)

希望它能为某人节省 10 秒!;)

于 2016-01-26T20:03:57.050 回答
18

我曾经需要这个。我创建了一个自定义UIView类 - 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

让你的观点扩展这个类。当然,这只确保子视图高于其所有同级视图。

于 2012-11-01T17:39:11.367 回答
8

据我经验,zposition 是最好的方法。

self.view.layer.zPosition = 1;

于 2017-03-06T13:17:19.857 回答
2

让我做一个结论。在斯威夫特 5

如果您在最后添加视图,您可以选择将子视图添加到 keyWindow。否则,您可以将SubViewToFront。

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

您还可以设置 zPosition。但缺点是不能更改手势响应顺序。

view.layer.zPosition = 1
于 2019-12-24T08:43:49.010 回答
1

在 c# 中,View.BringSubviewToFront(childView); YourView.Layer.ZPosition = 1; 两者都应该工作。

于 2019-05-22T15:51:25.573 回答
0

斯威夫特 4.2

UIApplication.shared.keyWindow!.bringSubviewToFront(yourView)

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

于 2018-10-25T09:45:52.980 回答