目前我有一个包含一些控件的UIView。然后我有一些图像,我以编程方式添加到视图中以显示为动画。目前在我的游戏循环的每个间隔结束时,我必须告诉控制器将UIView控件移动到前面,否则图像将出现在它的顶部。是否有一种成本较低的方法,使其始终保持最佳状态。
目前我在游戏循环结束时有以下内容:
[self.view bringSubviewToFront:myControlView];
游戏启动时我可以做这样的事情:
myControlView.alwaysOnTop = true;
答案 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。然后将所有其他视图添加到容器视图,而不是主视图。