Как сделать UIView всегда появляться на фронте?

В настоящее время у меня есть UIView, который содержит некоторые элементы управления. Затем у меня есть некоторые изображения, которые я программно добавляю в представление для отображения в виде анимаций. В настоящий момент в конце каждого интервала моего игрового цикла я должен сказать контроллеру переместить элемент управления UIView на фронт, иначе изображения появятся поверх него. Существует ли менее дорогостоящий метод его сохранения, как всегда сверху.

В настоящее время у меня есть следующее в конце игрового цикла:

[self.view bringSubviewToFront:myControlView];

Могу ли я сделать что-то подобное, когда начинается игра:

myControlView.alwaysOnTop = true;

Ответ 1

Вместо того, чтобы использовать -addSubview: для вставки изображений, используйте -insertSubview:belowSubview: и передайте UIView в качестве второго параметра:

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

Обратите внимание, что для аналогичных целей у вас также есть доступ к методам -insertSubview:aboveSubview: и -insertSubview:atIndex:.

Ответ 2

Objective-C

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

Swift 2

myAlwaysOnTopView.layer.zPosition = .max

Swift 3

myAlwaysOnTopView.layer.zPosition = .greatestFiniteMagnitude

Это решение лучше, особенно если вы хотите, чтобы ваше представление всегда было на высоте, независимо от других представлений, добавленных после него. Просто добавьте любое другое представление, используя addSubview:, и он всегда будет на высоте.

Ответ 3

Другой вариант - разместить ваше представление на другом UIWindow с более высоким значением windowLevel. Узнайте из Flipboard FLEX или моего упрощенного Paramount

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

Manager.show()

Взгляните на FLEXWindow о том, как правильно выбрать windowLevel и обрабатывать 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 a balance between staying above the app 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;
}

Ответ 4

чтобы заставить subview перемещаться к задней части всех других текущих подзонов, используйте view.sendSubviewToBack(yourSubview).