AppDelegateが持っているUIWindowのリサイズがモーダルビューを表示すると元に戻る
今、テザリング時のような見た目のビュー(ボタン)を設置してアクションさせるための機能を作成しています。
具体的には、とあるアクション時に、画面上部に44pxの高さのボタンを設置し、ショートカットとして使ってもらうことを想定したものです。
現在の実装は、AppDelegateが持っているkey windowを縮小し、上端に空きを作った上でそこにボタンを配置しています。
iOS8では意図した通りに動作しているのですが、iOS6, 7で意図した挙動にならないときがあります。
意図した挙動にならないのは「モーダルビュー」を表示した時で、presentViewController:animated:completion:
を実行したタイミングです。
これを実行すると、(見た目には)上記でリサイズしたkey windowのサイズが元に戻り、その上でモーダルビューが表示されます。
結果として重ねたボタンの下にビューが潜り込んでしまう、というものです。
この挙動について、なにか分かりますでしょうか?
[2015.02.04 追記]
コメント頂いたので再現する最小コードを載せます。
再現手順は、
- 新規プロジェクト作成(Storyboard未使用)
- AppDelegateに以下コード追加
- 起動(Run)
- 画面中央あたりにある+ボタン押下(UIWindowリサイズ)
- barButton(ブックマーク型)押下(modal view表示)
- 現象発生
となります。
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
button.frame = CGRectMake(50, 150, 100, 44);
[button addTarget:self
action:@selector(tap:)
forControlEvents:UIControlEventTouchUpInside];
// ViewController
self.viewController = [[UIViewController alloc] init];
self.viewController.view.backgroundColor = UIColor.blueColor;
self.viewController.definesPresentationContext = NO;
[self.viewController.view addSubview:button];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks
target:self
action:@selector(barBtnTap:)];
self.viewController.navigationItem.rightBarButtonItem = barButton;
// NavigationController
UINavigationController *nv = [[UINavigationController alloc] initWithRootViewController:self.viewController];
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
self.window.backgroundColor = UIColor.redColor;
self.window.rootViewController = nv;
[self.window makeKeyAndVisible];
return YES;
}
- (void)barBtnTap:(id)sender
{
UIView *mark = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
mark.backgroundColor = UIColor.yellowColor;
UIViewController *modal = [[UIViewController alloc] init];
modal.view.backgroundColor = UIColor.grayColor;
[modal.view addSubview:mark];
[self.viewController presentViewController:modal
animated:YES
completion:nil];;
}
- (void)tap:(id)sender
{
self.backupFrame = self.window.frame;
CGRect newFrame = self.window.frame;
NSInteger pad = 60;
newFrame.size.height -= pad;
newFrame.origin.y += pad;
self.window.frame = newFrame;
CGRect otherFrame = CGRectMake(0, 0, newFrame.size.width, pad);
self.otherWindow = [[UIWindow alloc] initWithFrame:otherFrame];
self.otherWindow.backgroundColor = UIColor.greenColor;
[self.otherWindow makeKeyAndVisible];
}