Jak sprawić, by UIView zawsze pojawiał się z przodu?

Obecnie mam UIView, który zawiera kilka kontrolek. Następnie mam kilka obrazów, które programowo dodaję do widoku, aby wyświetlić je jako animacje. Obecnie na końcu każdego interwału mojej pętli gry muszę powiedzieć kontrolerowi, aby przesunął kontrolę UIView na przód, w przeciwnym razie obrazy pojawią się na nim. Czy istnieje mniej kosztowna metoda, aby utrzymać się jak zawsze na górze.

Obecnie mam następujące na koniec mojej gry pętla:

[self.view bringSubviewToFront:myControlView];

Czy Mogę zrobić coś takiego, gdy gra się uruchamia:

myControlView.alwaysOnTop = true;
Author: woot586, 2011-06-28

5 answers

Zamiast używać -addSubview: do wstawiania obrazów, użyj -insertSubview:belowSubview: i podaj UIView jako drugi parametr:

[self.view insertSubview:myImage belowSubview:myControlView];

Zauważ, że do podobnych celów masz również dostęp do metod -insertSubview:aboveSubview: i -insertSubview:atIndex:.

 25
Author: Seamus Campbell,
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
2011-06-28 19:03:35

Objective-C

#import <QuartzCore/QuartzCore.h>
myAlwaysOnTopView.layer.zPosition = MAXFLOAT;

Swift 2

myAlwaysOnTopView.layer.zPosition = .max

Swift 3

myAlwaysOnTopView.layer.zPosition = .greatestFiniteMagnitude

Swift 5.3

view.layer.zPosition = CGFloat(Float.greatestFiniteMagnitude)

To rozwiązanie jest lepsze, zwłaszcza jeśli chcesz, aby twój widok był zawsze na SZCZYCIE, niezależnie od innych widoków dodanych po nim. Po prostu dodaj dowolny inny widok za pomocą addSubview: i zawsze pozostanie na wierzchu.

 180
Author: Muhammad Hassan Nasr,
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
2020-11-11 19:25:48

Inną opcją jest umieszczenie widoku na innym UIWindow z wyższym oknem. Ucz się z Flipboard FLEX lub mojego uproszczonego Paramount

Manager.action = {
  print("action touched")
}

Manager.show()

Spójrz na FLEXWindow Jak dobrać odpowiednią szybę i uchwyt touch

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
        // Some apps have windows at UIWindowLevelStatusBar + n.
        // If we make the window level too high, we block out UIAlertViews.
        // There's a balance between staying above the app's windows and staying below alerts.
        // UIWindowLevelStatusBar + 100 seems to hit that balance.
        self.windowLevel = UIWindowLevelStatusBar + 100.0;
    }
    return self;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    BOOL pointInside = NO;
    if ([self.eventDelegate shouldHandleTouchAtPoint:point]) {
        pointInside = [super pointInside:point withEvent:event];
    }
    return pointInside;
}
 3
Author: onmyway133,
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
2016-04-26 21:59:36

Aby przenieść podgląd do tyłu wszystkich pozostałych podglądów, użyj view.sendSubviewToBack(yourSubview).

 1
Author: PeiweiChen,
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
2016-03-15 15:08:24

Pamiętaj, że jest też ta metoda,

- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview
 0
Author: Frostmourne,
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
2019-12-20 10:15:06