Wprowadzenie subview, aby być przed wszystkimi innymi widokami

Pracuję obecnie nad integracją dostawcy reklam z moją aplikacją. Chcę umieścić blaknący komunikat przed reklamą, gdy reklama się wyświetla, ale całkowicie się nie powiodło.

Zrobiłem funkcję, która dodaje subview do mojego bieżącego widoku i próbuje doprowadzić go do przodu za pomocą

[self.view bringSubviewToFront:mySubview]

Funkcja zostanie wywołana przy powiadomieniu o załadowaniu reklamy (powiadomienie pochodzi z zestawu SDK adprovidera). Jednak mój subview nie kończy się przed reklamą. Wyobrażam sobie, że to jest zrobione celowo trudne przez dostawcę ogłoszeń, ale chcę to zrobić bez względu na to. Obecnie dyskutuję z dostawcą, czy można na to pozwolić. Ale na razie chcę tylko sprawdzić, czy to w ogóle możliwe.

Czy w każdym razie mogę wymusić, aby mój subview był najwyższym widokiem, tak aby nic go nie przeszkadzało?

Author: Mark S, 2012-11-01

5 answers

Co jeśli Widok dostawcy reklamy nie jest dodawany do self.view, ale do czegoś takiego jak [UIApplication sharedApplication].keyWindow?

Spróbuj czegoś takiego:

[[UIApplication sharedApplication].keyWindow addSubview:yourSubview]

Lub

[[UIApplication sharedApplication].keyWindow bringSubviewToFront:yourSubview]
 82
Author: jere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-01 17:38:59

Spróbuj tego:

self.view.layer.zPosition = 1;
 148
Author: daniel kilinskas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 12:09:59

Kiedyś tego potrzebowałam. Stworzyłem własną klasę 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

Niech twój pogląd rozszerzy tę klasę. Oczywiście zapewnia to tylko, że subview jest przede wszystkim jego siostrzanymi widokami.

 18
Author: rmaddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-01 17:39:11

Swift 2 Wersja odpowiedzi Jere:

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

Swift 3:

UIApplication.shared.keyWindow!.bringSubview(toFront: YourViewHere)
Mam nadzieję, że oszczędzi to komuś 10 sekund! ;)
 17
Author: Paul Lehn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-15 15:56:39

O ile doświadczyłem zposition jest najlepszym sposobem.

Self.widok.warstwa.zPosition = 1;

 7
Author: Gobi M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 13:17:19