今、テザリング時のような見た目のビュー(ボタン)を設置してアクションさせるための機能を作成しています。

具体的には、とあるアクション時に、画面上部に44pxの高さのボタンを設置し、ショートカットとして使ってもらうことを想定したものです。

現在の実装は、AppDelegateが持っているkey windowを縮小し、上端に空きを作った上でそこにボタンを配置しています。
iOS8では意図した通りに動作しているのですが、iOS6, 7で意図した挙動にならないときがあります。

意図した挙動にならないのは「モーダルビュー」を表示した時で、presentViewController:animated:completion:を実行したタイミングです。
これを実行すると、(見た目には)上記でリサイズしたkey windowのサイズが元に戻り、その上でモーダルビューが表示されます。

結果として重ねたボタンの下にビューが潜り込んでしまう、というものです。
この挙動について、なにか分かりますでしょうか?

[2015.02.04 追記]

コメント頂いたので再現する最小コードを載せます。
再現手順は、

  1. 新規プロジェクト作成(Storyboard未使用)
  2. AppDelegateに以下コード追加
  3. 起動(Run)
  4. 画面中央あたりにある+ボタン押下(UIWindowリサイズ)
  5. barButton(ブックマーク型)押下(modal view表示)
  6. 現象発生

となります。

- (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];
}