如何使UIView始终显示在前面



目前我有一个包含一些控件的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添加到顶部。然后将所有其他视图添加到容器视图中,而不是添加到主视图中。

最新更新