35

我想将 CGPoint 从我的 UIView 转换为 UIWindow 坐标,并意识到 UIApplication keyWindow 始终为零;为什么是这样?

我已经尝试过convertPoint:toView:UIView 的方法。

请参阅我在 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 应该在这里工作,但为零。为什么是这样?

4

4 回答 4

47

[window makeKeyAndVisible];此代码在应用程序委托内部执行之前。所以,难怪为什么keyWindownil没有。

于 2010-07-30T14:22:02.700 回答
38

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

UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window];
// Do something with the window now
于 2013-03-25T20:05:41.590 回答
16

我注意到在启动引导式访问后,[UIApplication sharedApplication] 上的 keyWindow 属性似乎为零。

在设置>常规>引导访问中启用引导访问模式后第一次启动引导访问模式时,它仅在iOS7上发生,因此实际显示启动GAM视图而不是绕过。

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

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

代替

[[UIApplication sharedApplication] keyWindow];

也许你也可以尝试使用

[[[UIApplication sharedApplication] delegate] window];

正如iWasRobbed指出的那样,但它对我不起作用,因为通过rootViewController这种方式无法到达该物业。

于 2014-01-10T11:19:02.620 回答
1

试试这个,先拿到UINavigationController句柄,再拿到topViewController

let navController = window?.rootViewController as! UINavigationController
let yourMainViewController = navController.topViewController as! ItemsViewController

或者

let yourMainViewController = navController.viewControllers.first as! ItemsViewController
于 2019-02-05T06:57:11.887 回答