2

custom を使用して、ナビゲーション コントローラーに含まれるコントローラーからナビゲーション コントローラーを提示しますUIPresentationController

私の問題は、元のステータス バーの外観を保持できないことです。ステータスバーの制御を新しく提示されたモーダルに任せたくありません。代わりに、ソースコントローラーに任せたいと思います。これどうやってするの?

私は遊んでmodalPresentationStyleいましたが、それで何も達成できませんでした。私の場合、唯一の妥当な値はUIModalPresentationCustomです。

preferredStatusBarStyleiOS 9 では、ナビゲーション コントローラーがナビゲーション バー スタイルから適切なものを選択するため、どこにも実装しません。

self.stackTransitionDelegate = [[StackTransitionDelegate alloc] init];

controller.modalPresentationStyle = UIModalPresentationCustom;
controller.transitioningDelegate = self.stackTransitionDelegate;

[self.presentationContext presentViewController:controller animated:YES completion:nil];

トランジション自体はハーフモーダルです。つまり、ソース コントローラの一部が画面に残ります。UIPresentationControllerこれが、サブクラスが実装する理由ですshouldRemovePresentersView

- (BOOL)shouldPresentInFullscreen {
    return NO;
}

アップデート:

次のレーダー: ( https://openradar.appspot.com/22565293 ) は問題を説明しており、プライベート メソッドの助けを借りて、提示されたコントローラーがステータス バーの外観をキャプチャするのを防ぐことができます。

- (BOOL)_shouldChangeStatusBarViewController {
    if([self.presentedViewController isBeingPresented]) {
        return NO;
    }
    return YES;
}

同じことを達成する公式の方法があるのだろうか。

4

1 に答える 1

1

これを回避する方法は次のとおりです。

- (UIStatusBarStyle)preferredStatusBarStyle {
  UIViewController *viewController = self.presentingViewController;
  while ([viewController childViewControllerForStatusBarStyle]) {
    viewController = [viewController childViewControllerForStatusBarStyle];
  }
  return [viewController preferredStatusBarStyle];
}
于 2016-06-02T23:15:47.030 に答える