将子视图放在所有其他视图的前面

时间:2012-11-01 17:34:11

标签: ios uiview subview

我正在努力将广告提供商集成到我的应用中。我希望在广告显示但广告不完整时在广告前放置一条淡化消息。

我创建了一个功能,在我当前视图中添加子视图,并尝试使用

将其显示在前面
[self.view bringSubviewToFront:mySubview]

该功能会在加载广告的通知时触发(通知来自adprovider的SDK)。但是,我的子视图不会在广告前面结束。我认为这是广告提供商故意制作的,但我希望无论如何都这样做。我目前正在与提供商讨论是否允许这样做。但就目前而言,我只是想看看它是否可能。

反正我是否可以强迫我的子视图成为最顶级的视图,以免被任何东西阻挡?

9 个答案:

答案 0 :(得分:157)

试试这个:

self.view.layer.zPosition = 1;

答案 1 :(得分:85)

如果广告提供商的视图未添加到self.view,但会添加到[UIApplication sharedApplication].keyWindow之类的内容,该怎么办?

尝试类似:

[[UIApplication sharedApplication].keyWindow addSubview:yourSubview]

[[UIApplication sharedApplication].keyWindow bringSubviewToFront:yourSubview]

答案 2 :(得分:21)

Swre 2版Jere的回答:

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

斯威夫特3:

UIApplication.shared.keyWindow!.bringSubview(toFront: YourViewHere)
斯威夫特4:

UIApplication.shared.keyWindow!.bringSubviewToFront(YourViewHere)

希望它可以节省10秒! ;)

答案 3 :(得分: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

让您的观点扩展此课程。当然,这只能确保子视图高于其所有兄弟视图。

答案 4 :(得分:6)

据我所知,zposition是一种最好的方式。

  

self.view.layer.zPosition = 1;

答案 5 :(得分:0)

答案 6 :(得分:0)

xamarin ios: this.InsertSubview(subview_youwant_beback,0);

答案 7 :(得分:0)

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

答案 8 :(得分:0)

让我总结一下。 在Swift 5中

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

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

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

view.layer.zPosition = 1