IOS8のステータスバーの新しい自動非表示に多くの問題があります。
私のアプリでは、ユーザーが1回タップすると、ナビゲーションバーとステータスバーが消えるビューがあります。
横向きの場合、ステータスバーは自動的に非表示になり、問題ありません。ポートレートモードでのみ必要です。
ただし、問題は、デバイスが横向きでバーが表示されている場合、ユーザーが2回タップしてバーを切り替え(表示中)、デバイスを縦向きモードにすると、ステータスバーが非表示のままになることです。
基本的に、iOS 8での自然な動作を妨げることなく、statusBarを非表示にできる必要があるため、シナリオを要約します。
MRW>
(出典: mshcdn.com )
WillRotateでstatusBarを調整しようとしましたが、想定外のときにstatusBarが表示されるという混乱を引き起こしました。私が使用しているコード:
- (BOOL)prefersStatusBarHidden
{
return statusBarHidden;
}
-(void)toggleBars:(UITapGestureRecognizer *)gesture{
CATransition *animation = [CATransition animation];
animation.type = kCATransitionFromBottom;
animation.subtype = kCATransitionFromTop;
animation.duration = .2f;
[animation setTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]];
BOOL toggleNavigationBar = self.navigationController.navigationBarHidden;
[self.navigationController.navigationBar.layer addAnimation:animation forKey:nil];
[self.navigationController setNavigationBarHidden:!toggleNavigationBar animated:YES];
BOOL toggleTabHidden = self.tabBarController.tabBar.hidden;
if(![[[NSUserDefaults standardUserDefaults] objectForKey:@"showTabBar"]isKindOfClass:[NSNull class]]){
if([(NSNumber*)[[NSUserDefaults standardUserDefaults] objectForKey:@"showTabBar"]boolValue])
{
[self.tabBarController.tabBar.layer addAnimation:animation forKey:nil];
[self.tabBarController setHideTabBar:!toggleTabHidden animated:YES];
}
}
statusBarHidden = [UIApplication sharedApplication].statusBarHidden;
[[UIApplication sharedApplication] setStatusBarHidden:!statusBarHidden withAnimation:UIStatusBarAnimationSlide];
[self setNeedsStatusBarAppearanceUpdate];
if (IS_IOS8){
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){
if (statusBarHidden){
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
}
}
}
横向きでstatusBarが非表示になっていて、すべてのコントロールがそこにあるときに、回転するとstatusBarがトリガーされるフラグを設定することを考えていました。どうやら成功しなかった。
どんな助けでも大歓迎です。
UIViewControllerベースのステータスバーの外観を使用していますか? prefersStatusBarHidden
を実装する場合はそうだと思います。
さて、
[[UIApplication sharedApplication] setStatusBarHidden:!statusBarHidden withAnimation: UIStatusBarAnimationSlide];
uIViewControllerベースのステータスバーの外観では機能しないはずです。
prefersStatusBarHidden
メソッドから異なる値を返し、setNeedsStatusBarAppearanceUpdate
を呼び出して、戻り値が変更されたことをアプリに通知する必要があります。
したがって、ステータスバーの表示を変更するには、
@property (nonatomic, assign) BOOL hideStatusBar;
- (BOOL)prefersStatusBarHidden
{
return self.hideStatusBar;
}
- (void)toggleBars:(UITapGestureRecognizer *)gesture
{
... hide navbar and tabbar ...
self.hideStatusBar = ! self.hideStatusBar;
[self setNeedsStatusBarAppearanceUpdate];
}
以上です!
これは私のために働いた:
- (void)viewWillLayoutSubviews {
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}
#pragma mark After and Before Oriantation Change Methods+Delegate
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}
#pragma mark nav
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
これは短くて簡単な方法です。