37 votes

UIView n'est pas redimensionnée en plein écran lorsque vous cacher la barre de navigation & de la barre d'onglets

J'ai une application qui a un onglet de la barre et la barre de navigation pour des relations normales. L'un de mes écrans est une grande partie du texte, j'ai donc permettre à l'utilisateur de taper pour le plein écran (un peu comme les Photos.app).

La barre de navigation & de la barre d'onglets sont cachés, et j'ai mis le texte sur l'image pour être en plein écran. Le problème est, il est à propos de 50px de l'espace blanc où la barre d'onglet utilisé pour être. Vous pouvez voir si à partir de cette capture d'écran:

alt text

Je ne suis pas sûr de ce qui cause cela. L'espace est certainement pas la vue derrière l'affichage de texte, comme je l'ai mis de la couleur d'arrière-plan rouge juste pour être sûr. Ce pourrait être la cause?

** Mise à JOUR **

J'ai fait de frapper un essai dans un UIWindow sous-classe et a trouvé que l'espace est en fait la documentée/non publiées UILayoutContainerView. C'est la vue parent de la tabBar. Je ne pense pas qu'il est recommandé de manipuler directement ce point de vue, alors comment puis-je masquer la barre d'onglets?

** Mise à JOUR # 2 **

J'ai vérifié l'auto.vue de l'image avant et après l'animation, et il semble que la vue parent n'est pas de redimensionnement assez.

après être passé en mode plein écran, l'affichage de l'image est seulement 411 pixels de hauteur. J'ai essayé de jouer avec le cadre à la main et réglage autoResizeMask avec pas de chance.

** Mise à JOUR: Voici le résultat final **

- (void)toggleFullscreen {
    isFullScreen = !isFullScreen;  //ivar

    //hide status bar & navigation bar
    [[UIApplication sharedApplication] setStatusBarHidden:isFullScreen animated:YES];
    [self.navigationController setNavigationBarHidden:isFullScreen animated:YES];

    [UIView beginAnimations:@"fullscreen" context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:.3];

    //move tab bar up/down
    CGRect tabBarFrame = self.tabBarController.tabBar.frame;
    int tabBarHeight = tabBarFrame.size.height;
    int offset = isFullScreen ? tabBarHeight : -1 * tabBarHeight;
    int tabBarY = tabBarFrame.origin.y + offset;
    tabBarFrame.origin.y = tabBarY;
    self.tabBarController.tabBar.frame = tabBarFrame;

    //fade it in/out
    self.tabBarController.tabBar.alpha = isFullScreen ? 0 : 1;

    //resize webview to be full screen / normal
    [webView removeFromSuperview];
    if(isFullScreen) {
                //previousTabBarView is an ivar to hang on to the original view...
    	previousTabBarView = self.tabBarController.view;
    	[self.tabBarController.view addSubview:webView];

    	webView.frame = [self getOrientationRect];  //checks orientation to provide the correct rect

    } else {
    	[self.view addSubview:webView];
    	self.tabBarController.view = previousTabBarView;
    }

    [UIView commitAnimations];
}

(note que je suis passé de textview de webview, mais le même travaille pour le texte original de la vue)

31voto

Harry Points 2080

J'ai eu exactement ce problème lorsque je suis a l'animation de la barre d'onglets et la barre de navigation au bas et en haut de l'écran, respectivement, en laissant un 49px haute blanc de l'espace où la barre d'onglet a été.

Il s'avère que la raison pour laquelle mon nouveau "plein écran" vue n'est pas vraiment le remplissage de l'espace est parce que j'ai l'ajout de la vue plein écran comme une sous-vue de la navigation du contrôleur de la vue, qui lui-même était un enfant de la barre d'onglet contrôleur.

Pour le fixer, j'ai simplement ajouté de la nouvelle vision en plein écran (dans votre cas le point de vue avec tout le texte) comme une sous-vue de la UITabBarController de vue.

[[[auto tabBarController] view] addSubview:yourTextView];

Ensuite, tout ce que vous devez faire est de vous assurer que votre sous-vue de l'image est de 480 x 320px et il devrait remplir l'écran (y compris la zone qui était auparavant le mystérieux espace blanc)

5voto

Louis Gerbarg Points 33025

Vous pouvez certainement faire quelque chose qui semble corriger en déplaçant le cadre de la vue tels que la barre d'onglets est hors de l'écran. Je sais que quelqu'un d'autre a mentionné que d'essayer, et vous avez dit qu'il ne fonctionnait pas, mais je soupçonne que le problème, c'est que vous n'avez pas le textviews redimensionner masque correctement le programme d'installation lorsque vous avez essayé. Voici le code qui devrait fonctionner:

- (void)viewDidLoad {
  [super viewDidLoad];
  currentlyHidden = NO;
}

- (void) hideStuff {
  SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];
  self.navigationController.navigationBarHidden = YES;

  CGRect newFrame = appDelegate.tabBarController.view.frame;
  newFrame.size.height += appDelegate.tabBarController.tabBar.frame.size.height;
  appDelegate.tabBarController.view.frame = newFrame;
}

- (void) showStuff {
  SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];

  CGRect newFrame = appDelegate.tabBarController.view.frame;
  newFrame.size.height -= appDelegate.tabBarController.tabBar.frame.size.height;
  appDelegate.tabBarController.view.frame = newFrame;

  self.navigationController.navigationBarHidden = NO;
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
  if (currentlyHidden) {
    [self showStuff];
    currentlyHidden = NO;
  } else {
    [self hideStuff];
    currentlyHidden = YES;
  }
}

En outre, puisque ce n'est certainement sensible à la façon dont vous avez vos plumes etc de l'installation, je suis à la publication d'un projet en ligne de sorte que vous pouvez le télécharger et obtenir un look à elle. C'est un assez minime démo, juste une Navigation en fonction du projet où le délégué met en place un onglet contrôleur et intègre le point de vue du contrôleur de la principale mine. Le reste est dans le RootViewController plume et de la classe. Les barres sont basculés à chaque fois qu'une touche commence, il suffit de tapoter sur l'écran. Évidemment, dans une application réelle, vous pourriez avoir besoin pour régler le défilement de vue les choses tellement le contenu n'apparaît pas à sauter.

3voto

Daniel Dickison Points 15182

Avez-vous mis votre point de vue du contrôleur hidesBottomBarWhenPushed de la propriété d' YES? Vous devez définir ce paramètre dans votre initWithNibName:bundle: ou initWithCoder: méthode. Quand il est poussé à la valeur liquidative du contrôleur, ce qui devrait masquer la barre d'onglets et de mettre le contenu en vue d'étendre vers le bas.

2voto

ojreadmore Points 614

Peut-être il y a un autre point de vue qui est intégré dans la partie de la barre d'onglet de la zone? C'est-à-dire, quelque chose de supplémentaire à cacher. Cela vous aidera à voir ce que les vues sont autour.

for (UIView *viewy in [self.navigationController.view subviews])
{
	NSLog([viewy description]);
}

2voto

Steve Points 21

J'ai trouvé que si vous marquez le nouveau point de vue, vous serez en poussant sur la pile de navigation avec la ligne suivante masque la barre d'onglet en tant qu'il est sur la pile.

scrollViewController.hidesBottomBarWhenPushed = YES;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X