web-dev-qa-db-ja.com

サブビューを他のすべてのビューの前に配置する

現在、広告プロバイダーをアプリに統合する作業を行っています。広告が表示されても完全に失敗した場合は、広告の前にフェードメッセージを配置したいと思います。

サブビューを現在のビューに追加し、それを使用して前面に表示しようとする関数を作成しました

[self.view bringSubviewToFront:mySubview]

この関数は、広告が読み込まれたという通知で起動します(通知は、プロバイダーのSDKからのものです)。ただし、サブビューが広告の前に表示されません。これは広告プロバイダーによって意図的に困難にされていると思いますが、私は関係なくそれをしたいと思います。現在、これを許可できるかどうかについてプロバイダーと話し合っています。しかし、当分の間、私はそれが可能かどうかを見たいだけです。

とにかく私のもののサブビューを最上部のビューに強制して、何にも遮られないようにすることができますか?

60
Mark S

広告プロバイダーのビューがself.viewではなく[UIApplication sharedApplication].keyWindowなどに追加された場合はどうなりますか?

次のようなものを試してください:

[[UIApplication sharedApplication].keyWindow addSubview:yourSubview]

または

[[UIApplication sharedApplication].keyWindow bringSubviewToFront:yourSubview]
87
jere

これを試して:

self.view.layer.zPosition = 1;
160

Jereの答えのSwift 2バージョン:

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

スウィフト3:

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

スウィフト4:

UIApplication.shared.keyWindow!.bringSubviewToFront(YourViewHere)

誰かが10秒節約できることを願っています! ;)

21
Paul Lehn

一度これが必要になりました。カスタム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

ビューでこのクラスを拡張してください。もちろん、これは、サブビューがその兄弟ビューよりも上であることを保証するだけです。

18
rmaddy

私が経験した限り、zpositionは最良の方法です。

self.view.layer.zPosition = 1;

7
Gobi M

C#では、View.BringSubviewToFront(childView); YourView.Layer.ZPosition = 1;両方とも機能するはずです。

1

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

0
user5266363

InSwift 4.2

UIApplication.shared.keyWindow!.bringSubviewToFront(yourView)

ソース: https://developer.Apple.com/documentation/uikit/uiview/1622541-bringsubviewtofront#declarations

0
Vinoth Vino