Как сделать 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)
.