目前我有一个包含一些控件的UIView。然后,我用程序将一些图像添加到视图中,以显示为动画。目前,在我的游戏循环的每个间隔结束时,我必须告诉控制器将UIView控件移到前面,否则图像将出现在它的顶部。有没有一种成本较低的方法可以使它始终保持在顶部。
目前我在游戏循环的末尾有以下内容:
[self.view bringSubviewToFront:myControlView];
当游戏启动时,我可以这样做吗:
myControlView.alwaysOnTop = true;
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)
此解决方案更好,尤其是如果您希望您的视图始终位于顶部,而不考虑在其后面添加其他视图。只需使用addSubview:
添加任何其他视图,它将始终位于顶部。
重要信息:此解决方案将使UIView显示在顶部,但它仍将位于UI系统的其他视图下方。也就是说,用户与视图的任何交互通常都不会起作用,因为它首先由其他重叠的视图处理。
与其使用-addSubview:
插入图像,不如使用-insertSubview:belowSubview:
并将UIView
作为第二个参数:
[self.view insertSubview:myImage belowSubview:myControlView];
请注意,出于类似目的,您也可以访问方法-insertSubview:aboveSubview:
和-insertSubview:atIndex:
。
另一个选项是将视图放置在另一个windowLevel更高的UIWindow上。从Flipboard FLEX或我的简化派拉蒙学习
Manager.action = {
print("action touched")
}
Manager.show()
查看FLEXWindow,了解如何选择正确的窗口级别和处理触摸
- (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;
}
要使子视图移动到所有其他当前子视图的后面,请使用view.sendSubviewToBack(yourSubview)
。
只要记住还有这个方法,
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview
另一个解决方案是为所有其他视图创建一个不可见的容器视图。首先将该容器视图添加到主视图中,然后将您想要的UIView添加到顶部。然后将所有其他视图添加到容器视图中,而不是添加到主视图中。