Answers:
每当我想在其他所有内容上显示一些覆盖时,我都将其直接添加到“应用程序窗口”的顶部:
[[[UIApplication sharedApplication] keyWindow] addSubview:someView]
(null)
我的iOS-8应用程序(故事板问题?)有什么提示吗?谢谢!(注意:(null)
在时间viewDidLoad
和viewWillAppear:
时间都返回。 viewDidAppear:
为时已晚
问题有两个部分:顶部窗口,顶部窗口的顶视图。
所有现有答案都错过了顶部窗口部分。但[[UIApplication sharedApplication] keyWindow]
不能保证是顶部窗口。
顶部窗户。windowLevel
一个应用程序不可能同时存在两个窗口,因此我们可以对所有窗口进行排序,windowLevel
然后得到最上面的一个。
UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {
return win1.windowLevel - win2.windowLevel;
}] lastObject];
在顶部窗口的顶视图。只是为了完整。正如问题中已经指出的那样:
UIView *topView = [[topWindow subviews] lastObject];
topView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];
实际上,您的应用程序中可能有多个UIWindow。例如,如果键盘在屏幕上,则[[UIApplication sharedApplication] windows]
它将至少包含两个窗口(您的键窗口和键盘窗口)。
因此,如果您希望视图同时出现在两者之上,则必须执行以下操作:
[[[[UIApplication sharedApplication] windows] lastObject] addSubview:view];
(假设lastObject包含具有最高windowLevel优先级的窗口)。
我坚持的是标题说明的问题,而不是讨论的问题。在任何给定点上哪个视图在顶部可见?
@implementation UIView (Extra)
- (UIView *)findTopMostViewForPoint:(CGPoint)point
{
for(int i = self.subviews.count - 1; i >= 0; i--)
{
UIView *subview = [self.subviews objectAtIndex:i];
if(!subview.hidden && CGRectContainsPoint(subview.frame, point))
{
CGPoint pointConverted = [self convertPoint:point toView:subview];
return [subview findTopMostViewForPoint:pointConverted];
}
}
return self;
}
- (UIWindow *)topmostWindow
{
UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {
return win1.windowLevel - win2.windowLevel;
}] lastObject];
return topWindow;
}
@end
可以直接与任何UIWindow作为接收器或任何UIView作为接收器一起使用。
如果要添加加载视图(例如,活动指示器视图),请确保您具有UIWindow类的对象。如果仅在显示加载视图之前显示操作表,keyWindow
则将是UIActionSheet
而不是UIWindow
。由于操作表将消失,因此加载视图也将随之消失。否则就是造成我问题的原因。
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
if (![NSStringFromClass([keyWindow class]) isEqualToString:@"UIWindow"]) {
// find uiwindow in windows
NSArray *windows = [UIApplication sharedApplication].windows;
for (UIWindow *window in windows) {
if ([NSStringFromClass([window class]) isEqualToString:@"UIWindow"]) {
keyWindow = window;
break;
}
}
}
如果您的应用程序仅以纵向方向工作,那就足够了:
[[[UIApplication sharedApplication] keyWindow] addSubview:yourView]
并且您的视图将不会显示在键盘和状态栏上。
如果您想通过键盘或状态栏获得最高的视图,或者您希望最高的视图可以随设备正确旋转,请尝试以下框架:
https://github.com/HarrisonXi/TopmostView
它支持iOS7 / 8/9。
如果要在屏幕上所有内容的上方添加视图,只需使用此代码。
[[UIApplication sharedApplication].keyWindow addSubView: yourView];
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
if (![NSStringFromClass([keyWindow class]) isEqualToString:@"UIWindow"]) {
NSArray *windows = [UIApplication sharedApplication].windows;
for (UIWindow *window in windows) {
if ([NSStringFromClass([window class]) isEqualToString:@"UIWindow"]) {
keyWindow = window;
break;
}
}
}