señal - ocultar barra de estado iphone
UIView no cambia el tamaño de la pantalla completa al ocultar la barra de navegación y la barra de pestañas (15)
Tengo una aplicación que tiene una barra de pestañas y barra de navegación para una interacción normal. Una de mis pantallas es una gran porción de texto, por lo que le permito al usuario presionar para ir a pantalla completa (algo así como Photos.app).
La barra de navegación y la barra de pestañas están ocultas, y configuré el cuadro de la vista de texto para que sea de pantalla completa. El problema es que hay aproximadamente 50 px de espacio en blanco donde solía estar la barra de pestañas. Puedes ver si desde esta captura de pantalla:
eliminado el enlace muerto de ImageShack
No estoy seguro de lo que está causando esto. El espacio en blanco definitivamente no es la vista detrás de la vista de texto, ya que configuro el color de fondo en rojo solo para estar seguro. ¿Qué podría estar causando esto?
** ACTUALIZACIÓN **
Hice algunas pruebas de impacto en una subclase de UIWindow y descubrí que el espacio en blanco es realmente UILayoutContainerView indocumentado / inédito. Esta es la vista principal de tabBar. No creo que se recomienda manipular directamente esta vista, así que ¿cómo puedo ocultar la barra de pestañas?
** ACTUALIZACIÓN # 2 **
Comprobé el marco de self.view antes y después de la animación, y parece que la vista principal no está cambiando de tamaño lo suficiente.
después de ir a pantalla completa, el marco de la vista tiene solo 411 píxeles de alto. Intenté jugar con el marco manualmente y también configurar AutoResizeMask sin suerte.
**** ACTUALIZACIÓN: Aquí está el resultado 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];
}
(tenga en cuenta que cambié la vista de texto a la vista web, pero lo mismo funciona para la vista de texto original)
¿Ha establecido las propiedades hidesBottomBarWhenPushed
del control de vista de su hidesBottomBarWhenPushed
propiedad hidesBottomBarWhenPushed
a YES
? initWithNibName:bundle:
configurar esto en su initWithNibName:bundle:
o initWithCoder:
. Cuando se empuja al controlador de navegación, esto debería ocultar la barra de pestañas y hacer que la vista de contenido se extienda hasta la parte inferior.
¿Ha intentado obligar al texto a "volver a escribir" (restablecer la propiedad .text del objeto que está utilizando)? He tenido muchas instancias en las que las vistas simplemente no vuelven a verificar o volver a pintar sus datos, y forzar parece ser la única solución. Si esto no es bueno desde el punto de vista de la experiencia del usuario, puede intentar hacer que las barras de navegación / tabulación sean transparentes después de que el usuario toque y antes de que desaparezcan. Esto normalmente extiende la vista al tamaño completo de la pantalla.
Agregue la cantidad de espacio extra a la dimensión de la vista, por lo tanto, si fuera el rectángulo CGRectMake (0,0,320,460), hágalo CGRectMake (0,0,320,480) ... Esto me ha pasado, no estoy exactamente seguro de por qué, podría Tiene que ver con la vista subyacente que está poniendo su vista de texto en la parte superior, pero simplemente agregando la dimensión debería hacerlo
Creo que el problema es que todavía estás en el controlador de la barra de pestañas, también he tocado algunos problemas con esto, y terminé creando dos vistas para que mi delegado de la aplicación controle, el controlador de la barra de pestañas y una vista separada eso contiene cualquier cosa que el controlador de la barra de pestañas intente tomar el control. ¿Podrías pasar tu vista al delegado de la aplicación y usarla allí quizás?
Definitivamente puede hacer algo que parece correcto al cambiar el marco de la vista de modo que la barra de pestañas quede fuera de la pantalla. Sé que alguien más mencionó haber intentado eso, y usted dijo que no funcionó, pero sospecho que el problema es que no tuvo la configuración de la máscara de cambio de tamaño de las vistas de texto correctamente cuando lo intentó. A continuación está el código que debería funcionar:
- (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;
}
}
Además, dado que esto es definitivamente sensible a cómo tienes configurada tu semilla, etc., estoy posting un proyecto en línea para que puedas descargarlo y echarle un vistazo. Es una demostración bastante mínima, solo un proyecto basado en navegación en el que el delegado configura un controlador de pestañas e inserta el controlador de vista desde el plumín principal. El resto está en la punta y la clase RootViewController. Las barras se activan cada vez que comienza un toque, así que simplemente toque la pantalla. Obviamente, en una aplicación real es posible que deba ajustar la vista de desplazamiento para que el contenido no parezca saltar.
Descubrí que si marcas la nueva vista presionarás en la pila de navegación con la siguiente línea, que oculta la barra de pestañas siempre que esté en la pila.
scrollViewController.hidesBottomBarWhenPushed = YES;
He experimentado un problema similar, esta discusión fue útil: UIWebView en el tamaño de iPad
La respuesta de Tony me ayudó a descubrir que cuando creas una subvista, es útil configurar un código similar al siguiente:
self.tabBarController.tabBar.frame = self.view.bounds;
Intente hacer que la vista TabBarControllers sea más grande que la pantalla, de modo que la barra de pestañas quede oculta, siempre que lo haga antes de que se configure el nuevo ViewController, ¡entonces su vista cambiará de tamaño para llenar el nuevo marco!
En mi prueba utilicé el control tabBarController: shouldSelectViewController: delegar método para verificar qué controlador de vista está a punto de actualizarse y configurar el TabBarController.view.frame en consecuencia. Por ejemplo:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
if( viewController == second)
tabBarController.view.frame = CGRectMake( 0, 20, 320, 500);
else
tabBarController.view.frame = CGRectMake( 0, 20, 320, 460);
}
Si aún así no es lo que necesita, intente buscar en el hideBottomBarWhenPushed propiedad de UIViewController. Cuando se establece en sí, hará que la barra inferior se oculte si el Controlador se empuja hacia una pila de navegación.
Me gustaría mover la vista a la ventana cuando elige ir a pantalla completa. p.ej
myView = [self.view retain];
self.view = nil;
[window addSubview:myView];
y volver atrás
[myView removeFromSuperView];
self.view = myView;
[myView release];
myView = nil;
Al agregar la vista como elemento secundario de la ventana, puede ser totalmente a pantalla completa y estará en la parte superior de la barra de pestañas.
Puede combinar esto con
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
para detectar la rotación (Creo que combinas esto con view.transform = CGAffineTransformMakeRotation para hacer que gire ...?)
Poner el código en una preparación para una transición como esta, funciona perfectamente para mí:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ViewPhoto"]) {
ImageView *vc = [segue destinationViewController];
NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
NSString *Title = [photoNames objectAtIndex:selectedIndex];
[vc setSelectedTitle:[NSString stringWithFormat:@"%@", Title]];
vc.hidesBottomBarWhenPushed = YES;
}
}
Si UITabBarController es empujado por un control raízViewController (navigationController). Puedes probar lo siguiente:
En primer lugar, ocultar el estado de la barra / barra de pestañas;
[self.navigationController pushViewController:aBlankViewController animated:NO];
[self.navigationController popViewControllerAnimated:NO];
Deberías poder reclamar el espacio en blanco, aunque la pantalla se sacudirá durante el ajuste ...
Si está utilizando el Interface Builder, asegúrese de que el ajuste automático esté configurado correctamente en Size Inspector. Si crea el UITextView en el código, asegúrese de establecer el marco lo suficientemente grande y de que el elemento primario de la vista (y su elemento primario) también sean lo suficientemente grandes. Para simplificar, agregue la vista a la ventana directamente, y luego muévase hacia adentro desde allí.
Para mover una vista a su supervista:
- (void)moveViewToSuperview:(UIView *)view
{
UIView *newSuperview = [[view superview] superview];
[view removeFromSuperview];
[newSuperview addSubview:view];
[newSuperview bringSubviewToFront:view];
}
Tal vez hay otra vista que es una parte integrada del área de la barra de pestañas? Es decir, algo adicional para ocultar. Esto te ayudará a ver qué puntos de vista existen.
for (UIView *viewy in [self.navigationController.view subviews])
{
NSLog([viewy description]);
}
Tuve este problema exacto cuando estaba animando la barra de pestañas y la barra de navegación de la parte inferior y superior de la pantalla, respectivamente, dejando un espacio en blanco alto de 49 píxeles donde estaba la barra de pestañas.
Resultó que el motivo por el que mi nueva vista de "pantalla completa" no llenaba realmente el espacio era porque estaba agregando la vista de pantalla completa como una subvista de la vista del controlador de navegación, que a su vez era un elemento secundario del controlador de la barra de pestañas.
Para solucionarlo, simplemente agregué la nueva vista a pantalla completa (en su caso, la vista con todo el texto) como una subvista de la vista de UITabBarController.
[[[self tabBarController] view] addSubview:yourTextView];
Luego, todo lo que necesita hacer es asegurarse de que el fotograma de su subvista sea 480 x 320 px y que llene la pantalla (incluido el área que anteriormente era el misterioso espacio en blanco)
Tuve un problema similar. Como Harry mencionó, es una razón del controlador de navegación que es el controlador interno del controlador de la barra de pestañas. Se encuentra de otra manera la forma de volver a dibujar su vista y tener el marco correcto. En su controlador, agregue lo siguiente:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Here you can make your tabBarControlelr.view.hidde = true or use any animation that hides UITabBar. I made
[TabBarController setTabBarHidden:YES];
self.navigationController.view.frame = CGRectMake(self.navigationController.view.frame.origin.x, self.navigationController.view.frame.origin.y, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height + 50);
[self.navigationController.view setNeedsLayout];
}
Y así es como lo escondo. Puedo hacerlo directamente llamando método de TabBarControlelr o clase método envoltorio:
+ (void)setTabBarHidden:(BOOL)hidden
{
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
TabBarController *tabBarController = (TabBarController *) delegate.window.rootViewController;
if ([tabBarController isKindOfClass:[TabBarController class]]) {
[tabBarController setTabBarHidden:hidden];
}
}
- (void)setTabBarHidden:(BOOL)hidden
{
if (self.tabBar.hidden == hidden) {
return;
}
if (hidden == NO) {
self.tabBar.hidden = hidden;
}
[UIView animateWithDuration:0.15 animations:^{
self.tabBar.frame = CGRectOffset(self.tabBar.frame, 0, ( hidden ? 50 : -50 ));
} completion:^(BOOL finished) {
self.tabBar.hidden = hidden;
}];
}