如何使UIView始终出现在前面?

时间:2011-06-28 18:37:59

标签: iphone uiview

目前我有一个包含一些控件的UIView。然后我有一些图像,我以编程方式添加到视图中以显示为动画。目前在我的游戏循环的每个间隔结束时,我必须告诉控制器将UIView控件移动到前面,否则图像将出现在它的顶部。是否有一种成本较低的方法,使其始终保持最佳状态。

目前我在游戏循环结束时有以下内容:

[self.view bringSubviewToFront:myControlView];

游戏启动时我可以做这样的事情:

myControlView.alwaysOnTop = true;

6 个答案:

答案 0 :(得分:168)

<强>目标C

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

Swift 2

myAlwaysOnTopView.layer.zPosition = .max

Swift 3

myAlwaysOnTopView.layer.zPosition = .greatestFiniteMagnitude

此解决方案更好,特别是如果您希望视图始终位于顶部,而不管其后添加的其他视图。只需使用addSubview:添加任何其他视图,它将始终保持最佳状态。

答案 1 :(得分:25)

不是使用-addSubview:插入图片,而是使用-insertSubview:belowSubview:并将UIView作为第二个参数传递:

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

请注意,出于类似目的,您还可以访问方法-insertSubview:aboveSubview:-insertSubview:atIndex:

答案 2 :(得分:3)

另一个选项是将视图放在具有更高windowLevel的另一个UIWindow上。向Flipboard FLEX或我简化的Paramount

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

Manager.show()

看看FLEXWindow如何选择合适的windowLevel和处理触摸

- (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 :(得分:1)

要将子视图移到所有其他当前子视图的后面,请使用view.sendSubviewToBack(yourSubview)

答案 4 :(得分:0)

请记住,也有这种方法

- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview

答案 5 :(得分:0)

另一种解决方案是为所有其他视图创建一个不可见的容器视图。首先将该容器视图添加到您的主视图中,然后添加您希望在顶部拥有的 UIView。然后将所有其他视图添加到容器视图,而不是主视图。