CGPointをUIView座標からUIWindow座標に変換したいのですが、UIApplication keyWindowは常にnilであることに気付きました。どうしてこれなの?
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はここで機能するはずですが、nilです。どうしてこれなの?
このコードは、アプリデリゲート内の[window makeKeyAndVisible];
の前に実行されました。それで、なぜkeyWindow
がnil
だったのかは不思議ではありません。
最も簡単な方法は、代わりにアプリデリゲートからウィンドウを取得することです。
UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window];
// Do something with the window now
ガイド付きアクセスを開始した後、[UIApplication sharedApplication]のkeyWindowプロパティがnilになっていることに気付きました。
設定>一般>ガイドアクセスで有効にした後、初めて時間ガイドアクセスモードを開始したときに、iOS7でのみ私に起こりました。 GAMビューは実際には表示され、バイパスされません。
これはApple APIはバグがあるように見えるので、探しているウィンドウを取得するために次のコードを使用して解決しました。
NSArray *windows = [[UIApplication sharedApplication] windows];
if ([windows count]) {
return windows[0];
}
return nil;
の代わりに
[[UIApplication sharedApplication] keyWindow];
多分あなたも使用してみることもできます
[[[UIApplication sharedApplication] delegate] window];
as iWasRobbed が指摘しましたが、rootViewController
プロパティにこの方法で到達できないため、機能しませんでした。
これを試して、最初にUINavigationController
ハンドルを取得し、次にtopViewControllerを取得します。
let navController = window?.rootViewController as! UINavigationController
let yourMainViewController = navController.topViewController as! ItemsViewController
または
let yourMainViewController = navController.viewControllers.first as! ItemsViewController