iOS Barre de tabulation dans iOS 6 crée une barre noire (correction pour iOS 6 casse iOS 7!)

J'ai une application à tabs et dans un onglet il y a un UIWebView . Lorsque je fais pivoter l'appareil en mode paysage, j'ai créé l' UIWebView plein écran tout en masquant l'état et la barre d'tabs.

Je l'ai fonctionné dans iOS 6 – à l'origine, en tournant et en masquant la barre d'tabs, cela laisserait un espace noir là où se trouvait la barre d'tabs, donc le code fHeight corrige cela. Cependant, sur iOS 6, cela a fonctionné parfaitement, mais maintenant, il crée en fait le problème de la barre noire d'iOS 6 !! Des idées pour une solution de contournement à cela?

S'il vous plaît voir mon édition ci-dessous cette

 - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; { if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { [self hideTabBar:self.tabBarController]; [[UIApplication sharedApplication] setStatusBarHidden:TRUE withAnimation:UIStatusBarAnimationSlide]; } else { [self showTabBar:self.tabBarController]; [[UIApplication sharedApplication] setStatusBarHidden:FALSE withAnimation:UIStatusBarAnimationSlide]; } } - (void) hideTabBar:(UITabBarController *) tabbarcontroller { CGRect screenRect = [[UIScreen mainScreen] bounds]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; float fHeight = screenRect.size.height; if( UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) ) { fHeight = screenRect.size.width; } for(UIView *view in self.tabBarController.view.subviews) { if([view isKindOfClass:[UITabBar class]]) { [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)]; } else { [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)]; view.backgroundColor = [UIColor blackColor]; } } [UIView commitAnimations]; } - (void) showTabBar:(UITabBarController *) tabbarcontroller { CGRect screenRect = [[UIScreen mainScreen] bounds]; float fHeight = screenRect.size.height - 49.0; if( UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) ) { fHeight = screenRect.size.width - 49.0; } [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; for(UIView *view in tabbarcontroller.view.subviews) { if([view isKindOfClass:[UITabBar class]]) { [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)]; } else { [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)]; } } [UIView commitAnimations]; } 

//Modifier

J'ai essayé d'utiliser ceci mais je ne suis pas sûr de savoir comment passer dans la vue correctement – j'ai essayé self.view et webView et d'autres mais je ne peux pas le faire fonctionner à la fois sur iOS 6 et 7! Toute sorte d'idée serait vraiment utile! Tenez-moi au courant si vous avez besoin de plus d'informations

 - (void)setTabBarHidden:(BOOL)hidden view:(UIView *)view animated:(BOOL)animated { if (self.tabBar.hidden == hidden) return; CGRect screenRect = [[UIScreen mainScreen] bounds]; float height = 0.0f; if(UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) { height = screenRect.size.width; } else { height = screenRect.size.height; } if (!hidden) { height -= CGRectGetHeight(self.tabBar.frame); } void (^workerBlock)() = ^() { self.tabBar.frame = CGRectMake(CGRectGetMinX(self.tabBar.frame), height, CGRectGetWidth(self.tabBar.frame), CGRectGetHeight(self.tabBar.frame)); view.frame = CGRectMake(CGRectGetMinX(view.frame), CGRectGetMinY(view.frame), CGRectGetWidth(view.frame), height); }; void (^completionBlock)(BOOL finished) = ^(BOOL finished) { self.tabBar.hidden = hidden; }; if (animated) { [UIView animateWithDuration:0.25f animations:workerBlock completion:completionBlock]; } else { workerBlock(); completionBlock(YES); } } 

J'ai créé un Gist public sur Github pour savoir comment nous faisons cela.

Cette solution a traversé plusieurs itérations grâce à @ Chris Byatt et à notre équipe qui l'a essayée. Donc, assurez-vous de download la dernière révision à partir de là.

La signature de la méthode a été simplifiée

 - (void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated; 

Vous pouvez l'appeler comme ceci dans votre sous-class UIViewController :

 [self.tabBarController setTabBarHidden:YES animated:YES]; 

OK les gars, après avoir lutté avec ça pendant environ deux heures, mon collègue m'a appris la bonne façon de le faire. Il y a en fait une solution très simple que je ne trouve pas en ligne:

juste mettre:

  self.hidesBottomBarWhenPushed = YES; 

Dans la méthode init de votre viewController et commentez le code associé à self.tabBar.hidden.

J'ai finalement eu ce travail, mais il a fallu un certain time. Il est issu d'un mélange de mon code original et de certains travaux de JRG-Developers.

 - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { BOOL toLandscape = UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation); CGRect screenRect = [[UIScreen mainScreen] bounds]; void (^workerBlock)() = ^() { [[UIApplication sharedApplication] setStatusBarHidden:toLandscape withAnimation:UIStatusBarAnimationSlide]; float height = toLandscape ? screenRect.size.width : screenRect.size.height - CGRectGetHeight(self.tabBarController.tabBar.frame); float width = toLandscape ? screenRect.size.height : screenRect.size.width; webView.frame = CGRectMake(CGRectGetMinX(webView.frame), CGRectGetMinY(webView.frame), width, height); [self moveTabBarToPosition:height]; }; [UIView animateWithDuration:0.25f animations:workerBlock]; } //Moving the tab bar and its subviews offscreen so that top is at position y -(void)moveTabBarToPosition:(int)y { self.tabBarController.tabBar.frame = CGRectMake(self.tabBarController.tabBar.frame.origin.x, y, self.tabBarController.tabBar.frame.size.width, self.tabBarController.tabBar.frame.size.height); for(UIView *view in self.tabBarController.view.subviews) { if ([view isKindOfClass:[UITabBar class]]) { [view setFrame:CGRectMake(view.frame.origin.x, y, view.frame.size.width, view.frame.size.height)]; } else { [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, y)]; view.backgroundColor = [UIColor blackColor]; } } } 

Dans mon cas c'est pour mon webview mais théoriquement vous pouvez lui donner n'importe quelle vue. Fonctionne sous iOS 6 et 7

 -(void) hideBottomTabs{ // Get the size of the main screen CGRect fullScreenRect = [[UIScreen mainScreen]bounds]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0){ UITabBar *bar = ((UITabBarController *)self.parentViewController).tabBarController.tabBar; fullScreenRect.size.height += ViewHeight(bar); } // Hide the tab bar ((UITabBarController *)self.parentViewController).tabBarController.tabBar.hidden = YES; // Resize and fill the screen [[((UITabBarController *)self.parentViewController).view.subviews objectAtIndex:0] setFrame:fullScreenRect]; 

}

J'ai résolu mon problème d'une telle manière.