将子视图置于其他所有视图的前面

64

我正在努力将广告提供商集成到我的应用程序中。我希望在广告显示时放置一个淡出消息,但一直没有成功。

我创建了一个函数,向当前视图添加了一个子视图,并尝试将其置于前面使用

[self.view bringSubviewToFront:mySubview]

该函数在接收到广告提供者SDK的广告加载通知后触发。然而,我的子视图最终没有显示在广告的前面。我想这是广告提供者故意设置的难点之一,但我仍希望实现此功能。目前我正在与广告提供者讨论是否可以允许这样做。但暂时,我只想看看是否可能。

有没有办法强制我的一个子视图成为最上层视图,以便不会被任何东西遮挡?

8个回答

179

试一下这个:

self.view.layer.zPosition = 1;

1
我可以问一下,为什么您在这个问题发布3年后才回复呢? - Mark S
97
我三年来一直在寻找解决方法 =) - daniel kilinskas
5
很遗憾,这无法改变手势响应顺序。 - Yinfeng
2
这只是将视图放在前面,但并没有处理所有的手势和触摸事件。因此,当用户尝试触摸该视图时,它会触摸到其他视图。@jere提供的解决方案是正确的。 - Daniel Benedykt
如何使上述视图处于活动状态 - hussain
显示剩余3条评论

90

如果广告提供商的视图不是添加到self.view,而是添加到像[UIApplication sharedApplication].keyWindow这样的东西上呢?

可以尝试这样做:

[[UIApplication sharedApplication].keyWindow addSubview:yourSubview]
或者
[[UIApplication sharedApplication].keyWindow bringSubviewToFront:yourSubview]

2
无法在iAd横幅视图中使用...这是一个常见的“需要置于顶部”的问题。(非VC不允许使用iAd) - Albert Renshaw
1
[parentview bringSubviewToFront:yourSubview],其中parentview是子视图的直接父视图。 - Daniel Benedykt

23

杰尔的答案Swift 2版本:

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

Swift 3:

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

Swift 4:

UIApplication.shared.keyWindow!.bringSubviewToFront(YourViewHere)

希望能为某人节省10秒钟的时间! ;)


如果我想将keyWindow本身置于前台怎么办?我遇到了一个问题,即keyWindow由于某种原因一直停留在后台... - Jesus Rodriguez

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

让你的视图扩展这个类。当然,这只能确保子视图在其所有同级视图之上。


这太棒了! - Rafael Nobre

8

根据我的经验,zPosition是一种最好的方法。

self.view.layer.zPosition = 1;


2

让我来做一个总结。在Swift 5中,

如果你是在最后添加视图,可以选择将其添加到keyWindow中,否则可以使用bringSubViewToFront方法。

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

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

view.layer.zPosition = 1

1
在c#中,View.BringSubviewToFront(childView)和YourView.Layer.ZPosition = 1都可以使用。

0

1
不,它们在Swift 4.2中已更改,请参阅https://developer.apple.com/documentation/uikit/uiview/1622541-bringsubviewtofront#declarations @LuigiTaira - Vinoth Vino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接