2010-07-29 87 views
23

我想从我的UIView转换一个CGPoint到UIWindow坐标,并意识到UIApplication keyWindow总是零;为什么是这样?UIApplication sharedApplication - keyWindow是否为零?

我试过了UIView的convertPoint:toView:方法。

请参见本文的示例代码我在视图控制器试图在Xcode(查看应用程序)的模板:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIView *test = [[UIView alloc] initWithFrame:CGRectMake(40,40,250,250)]; 
    [test setBackgroundColor:[UIColor redColor]]; 
    [self.view addSubview:test]; 

    CGPoint p = CGPointMake(100, 100); 
    CGPoint np; 

    np = [test convertPoint:p toView:[[UIApplication sharedApplication] keyWindow]]; 
    NSLog(@"p:%@ np:%@", NSStringFromCGPoint(p), NSStringFromCGPoint(np)); 

    AppDelegate *appDel = (AppDelegate *)[UIApplication sharedApplication].delegate; 

    np = [test convertPoint:p toView:[appDel window]]; 
    NSLog(@"p:%@ np:%@", NSStringFromCGPoint(p), NSStringFromCGPoint(np)); 

    np = [test convertPoint:p toView:nil]; 
    NSLog(@"p:%@ np:%@", NSStringFromCGPoint(p), NSStringFromCGPoint(np)); 

    [test release]; 

    if(![[UIApplication sharedApplication] keyWindow]) 
     NSLog(@"window was nil"); 
} 

,我也得到:

p:{100, 100} np:{100, 100} 
p:{100, 100} np:{140, 160} 
p:{100, 100} np:{100, 100} 
window was nil 

我可以转换,但只有当我通过应用程序委托访问窗口。而不是UIApplication。根据文档,keyWindow应该在这里工作,但是没有。 这是为什么?

回答

30

此代码在应用程序委托内部的[window makeKeyAndVisible];之前执行。 因此,难怪为什么keyWindow还是nil呢。

30

最简单的方法是从应用程序的委托,而不是获取窗口:

UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window]; 
// Do something with the window now 
+0

如果你的应用程序有多个窗口,这仍然有效吗?喜欢,基于文档的应用程序呢? – 2013-06-18 18:13:03

+2

你的意思是[UIApplication sharedApplication] .keyWindow – Laszlo 2013-12-11 14:49:31

+0

@Laszlo这不是一回事。一个从应用程序委托中获得窗口,一个窗口可能位于顶端。 – iwasrobbed 2017-11-08 19:32:41

11

我注意到,在已经开始的引导访问,在[UIApplication的sharedApplication]的keyWindow属性似乎是零。

有后开始指导接入模式为第一时候,它发生在我身上只有iOS7启用它在设置>通用>的指导下访问,所以出发GAM视图实际显示的,而不是绕过。

由于这个Apple API似乎有bug,我解决了使用下面的代码来检索我正在寻找的窗口。

NSArray *windows = [[UIApplication sharedApplication] windows]; 
if ([windows count]) { 
    return windows[0]; 
} 
return nil; 

而不是

[[UIApplication sharedApplication] keyWindow]; 

也许你也可以尝试使用

[[[UIApplication sharedApplication] delegate] window]; 

iWasRobbed指出,但它不是为我工作作为rootViewController属性是不可到达此办法。

相关问题