View Controllerの1つのステータスバーを非表示にしようとしています(モーダル表示の場合)。ビュー コントローラーを表示しているとき、ステータス バーは非表示になり、閉じたときに返されます。
提示されたView Controllerに次のコードを追加しました
- (BOOL)prefersStatusBarHidden
{
return YES;
}
また、Info.plist ファイルのキーを次のように設定しました。
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
私の理解では、これがこの作業を行うために必要なすべてのはずです。
また、カスタム アニメーション コントローラーを使用して、UIViewControllerAnimatedTransitioning
プロトコルに準拠したプレゼンテーションを行っています。実装では、animateTransition:
手動で を呼び出しprefersStatusBarHidden
、続いsetNeedsStatusBarAppearanceUpdate
て呼び出しが行われていることを確認しようとしましたが、ステータス バーは残ります。
なぜこれが起こっているのかについてのアイデアをいただければ幸いです。私は StackOverflow を検索しましたが、誰もこの問題を抱えていないようです。受け入れられたすべての回答はsetNeedsStatusBarAppearanceUpdate
、私がすでに行っている呼び出しを参照しています。
編集- 以下のコードは、希望どおりに機能するようになりました
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
if (self.isPresenting) {
UIView *containerView = [transitionContext containerView];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
toViewController.view.frame = containerView.frame;
[containerView addSubview:toViewController.view];
// Ask the presented controller whether to display the status bar
[toViewController setNeedsStatusBarAppearanceUpdate];
[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
toViewController.view.alpha = 1.0f;
fromViewController.view.alpha = 0.0f;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
else {
// do the reverse
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
toViewController.view.alpha = 1.0f;
fromViewController.view.alpha = 0.0f;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
// Once dismissed - ask the presenting controller if the status bar should be presented
[toViewController setNeedsStatusBarAppearanceUpdate];
}];
}
}
....
// PresentingController.m
- (BOOL)prefersStatusBarHidden
{
if (self.presentedViewController) {
return YES;
}
return NO;
}
// PresentedController.m
- (BOOL)prefersStatusBarHidden
{
return YES;
}