que mvc iphone objective-c uikit uiviewcontroller model-view-controller

iphone - que - mvc ios



IPhone-Después de descartar Modal View Controller, el espacio se deja en la parte superior de la página (16)

Al iniciar la aplicación, si el usuario no tiene información de inicio de sesión almacenada, quiero mostrar un controlador de vista modal para forzar la entrada de esta información. Con el método de prueba y error, encontré que esto tenía que ocurrir en viewDidAppear de mi controlador de vista raíz. Traté de ponerlo en viewDidLoad y viewWillAppear, pero esos no funcionaron a menos que asignara la vista del controlador de vista raíz a la vista del controlador de navegación utilizado en el modal que luego causó otros problemas ...

Así que tengo:

- (void)viewDidAppear:(BOOL)animated { NewAccountViewController *newAccountViewController = [[[NewAccountViewController alloc] initWithNibName:@"NewAccountViewController" bundle:nil] autorelease]; UINavigationController *accountNavigationController = [[UINavigationController alloc] initWithRootViewController:newAccountViewController]; [self presentModalViewController:accountNavigationController animated:YES]; }

Y en el nuevo ConcountViewController tengo un botón de elemento de navegación simple que descarta el controlador de vista modal con dismissModalViewController.

Todo esto funciona y cuando se descarta el modal, una vista en un controlador de navegación es visible con su título de elemento de navegación en la parte superior ....

Pero hay un espacio blanco del mismo tamaño que la barra de estado entre la barra de estado y la parte superior de la barra azul de elementos de navegación. Si no hago el modal, entonces la brecha nunca está allí. Solo ocurre después de que se presenta y descarta el modal. He intentado hacer animated: NO tanto en el presente como en dismissModalViewController. También traté de no usar el controlador de navegación en el modo modal, y eso tampoco hizo nada. ¡Cualquier idea sería genial! Gracias.


En caso de que alguien mire esta publicación (lo hice hoy y para que otros lo hagan). Soy un novato en el objetivo c pero me reiré de mi sugerencia, pero aquí va.

Cuando ejecuté mi aplicación para iPad, la barra de estado siempre superpuso mi formulario. No estaba contento de usar el método para cambiar la coordenada de marco a 20px así que fui buscando.

Descubrí que si tuviera que asignar mi controlador de vista personalizado a la ventana rootViewController, el problema de superposición de la barra de estado desapareció. No he probado las cosas modales en esta publicación, pero espero que esto ayude a otros novatos que se preguntan cómo resolver este problema.

Así es como se vería un simple método AppDelegate didFinishLaunchingWithOptions:

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. TEGGameViewController *gameVC = [[TEGGameViewController alloc] init]; self.window.rootViewController = gameVC; [self.window makeKeyAndVisible]; return YES; }


Encontré una manera más "elegante" de hacer esto. Si agrega una vista superior a su ventana, que es del mismo tamaño que la ventana, y agrega subvistas a esa vista superior en lugar de la ventana, todas las subvistas se compensarán en 20 píxeles en la dirección correcta, la barra de estado visible, sin espacios en cualquier lugar e incluso la rotación funcionará correctamente. Lo probé con iPad y iPhone 4.3 y 5.0 ... ¿Cuál es el truco? ;)


Encuentro que tanto la presentación como el rechazo de los controles de vista modal causan esto, especialmente cuando se desea hacer un diseño personalizado en -viewDidLoad (que algunos dicen que no se debe, pero nunca he encontrado una mejor manera de trabajar). Lo que hago es:

[self.view addSubview:self.viewController1.view]; // I suppose this layouts all (sub)views. [self.viewController1.view removeFromSuperview];

Ahora puedes presentar como tal:

self.viewController1.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self.viewController2 presentModalViewController:self.viewController1 animated:YES];

sin arriesgar que viewController1 se distribuya de forma incorrecta hasta que finalice la transición, y luego se ajusta a donde debería estar. Lo mismo se aplica al despido. Funciona para mí en iOS 3.0 a 5.0, iPhone y iPad.


Está bien, no sé por qué sucede esto, aunque me pasó a mí y le diré cómo lo arreglé. Descubrí que al agregar una vista en 0,0 se superponía con la barra de estado ... esto es raro porque antes de 3.0 nunca tuve proyectos, este comportamiento 0,0 siempre estaba debajo de la barra de estado. De todos modos, vi que se estaba superponiendo, así que empecé a poner mis puntos de vista en 0,20 o por grande que sea la barra de estado. Eso fue genial hasta que intenté usar un controlador de vista modal, cuando descartó el espacio del tamaño de la barra de estado (lo que está expirando), por alguna razón la vista modal cree que 0,0 NO se superpone a la barra de estado y cuando descarta 0,20 (de su vista anterior) aparece como si (0,0) no sobrepasa y (0,20) tiene el espacio blanco extra. ¿Por qué comenzó esto? Ninguna pista. De todos modos, para solucionarlo, sabía que tenía que arreglar toda la superposición de la vista y la barra de estado en 0,0 cosa. Seguí intentando pero nada, entonces decidí tratar de crear un nuevo proyecto basado en Vista en xcode (que configura la vista inicial para ti) y ver si su vista se superpone (o si lo ponen en 0,20), lo que encontrado es que NO se superpuso y 0,0 fue la colocación correcta, justo debajo de la barra de estado y no se superpone. Bizzare? creo que si. Entonces, lo que hice en mi proyecto fue copiar la configuración que tenían en el proyecto basado en vista recién creado (establecieron la propiedad viewControllers a través de Interface Builder, puedes crear un proyecto basado en la vista como yo lo hice y solo imitar su configuración), descubrió que esto solucionaba el problema, las vistas en 0,0 ya no se solapaban con la barra de estado y, al descartar los controladores de vista modal, ya no quedaba el espacio. No sé si este es tu caso, pero podría ser, espero que esto te ayude.


He tenido el mismo problema y esta es mi solución. Solo agregue esto a su AdDelegate:

- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave { if (!willLeave) [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; return YES; } - (void)bannerViewActionDidFinish:(ADBannerView *)banner { [[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES]; }

Es muy sencillo; cuando aparece el anuncio, oculto la barra de estado y cuando el anuncio desaparece, lo vuelvo a mostrar. Espero que la respuesta ayude a algunas personas.


La respuesta dada es difícil de entender, más como una sugerencia vaga, por lo que es un intento de explicar más detallada:

El problema es que el controlador de vista raíz que el método viewDidAppear: se presenta en la pregunta parece ser un UIViewController simple. Y cómo podemos ver en la documentación de Apple para wantsFullScreenLayout :

El valor predeterminado de esta propiedad es NO, lo que hace que la vista se distribuya para que no se superponga a la barra de estado

Este controlador de vista raíz presenta UINavigationController modal, por lo que el controlador de navegación presentado no utiliza toda la pantalla. También parece que el valor predeterminado de UINavigationController para wantsFullScreenLayout es YES . Es por eso que el controlador de navegación agrega la brecha, para evitar la superposición de la barra de estado con la barra de navegación.

Entonces hay varias formas de resolverlo:

1) Presente el controlador de navegación con la propiedad wantsFullScreenLayout establecida en NO. (O para presentar ~ UIViewController nuevo con una vista de UINavigationController como una subvista)

2) Cambie rootViewController propiedad rootViewController de UIWindow a la controladora de navegación, para que el controlador de navegación se presente en toda la ventana. Puede usarlo, por ejemplo, cuando la primera pantalla es tipo de entrada de PIN / contraseña desechable, y podemos soltarla fácilmente después del inicio de sesión exitoso y cambiar para el controlador de navegación.


Me encontré con el mismo problema. No estoy seguro de qué lo causa, pero lo solucioné con la siguiente línea de código justo después de descartar mi vista modal:

[self.view setFrame:CGRectMake(0, 10, self.view.frame.size.width, self.view.frame.size.height)];

Simplemente ajuste el desplazamiento en Y para que se ajuste a sus necesidades. En otra instancia, tuve que hacer 20 en lugar de 10.


Me estoy enfrentando al mismo problema. Admito que puede haber tomado una ruta no tradicional, incrustando una barra de pestañas en NavController, y ahora estoy viendo por qué dicen que no lo haga. Bueno, lo que sea, tiene sentido para mi aplicación, incluso si es un dolor total para implementar.

Mi problema es que una vez que empujé un VC modal a una subvista TabController (que es, a su vez, una subvista de la vista general NavController, que tiene control de la parte superior NavBar ... que se convierte en una pesadilla de delegación) y luego descarta la MVC, la vista que vuelve se desplaza hacia arriba debajo de NavBar. No sucede cuando agrego o presiono otras subvistas, solo con MVC.

[self.view setFrame: (CGRect)] parece hacer el truco, si lo llamo justo después de [self dismissModal ...]. Sin embargo, debe invocarse en todas las subvistas de mi controlador de barra de pestañas , o incluso las otras listas se derivan debajo de la barra. Poopy.

Hace las cosas un dolor de cabeza, pero no sin solución. Pero estoy de acuerdo, este es un nuevo error con 3.x (o tal vez es una de esas "características nuevas" de doble filo), y es francamente molesto. Estoy descargando 3.1.2 SDK ahora, y espero que solucione esto. Voy a comentar mis líneas [setFrame] y ver qué pasa. Pero con suerte, si no se resuelve en esta versión, será pronto. Hasta entonces, parece que la solución es una gran cantidad de código (ciertamente hacker y repetitivo).

EDITAR: No, la actualización no ayudó. Mierda. Volviendo al código que voy, para definir con precisión la posición de cada pantalla. Increíble. Esperemos que el tamaño de Nav y Tab Bars nunca cambie.

EDICION 2: ¡Oye! ¡Lo resolví! (iR prowd.) Parece que el problema fue que, cuando se eliminó mi MVC, mi vista pasó al control de la barra de pestañas, que se había "olvidado" de que tenía una barra de navegación encima. No me digas cómo, probablemente ya me haya salido del territorio documentado. Sin embargo, resolví mi problema en particular simplemente redefiniendo [vista_de_vista_de_televisor_frame: 0,0, ancho, alto] después de regresar de la edición. No estoy seguro de por qué esto marcó la diferencia, pero en la aplicación lo hizo, porque ya no es la primera fila y media de mi vista de tabla escondida debajo de la barra de navegación. Así que realmente no tengo ningún consejo, solo encuentro el lugar correcto para poner

[(appropriateViewController).view setFrame:CGRectMake(0,0,self.view.frame.size.width, self.view.frame.size.height];

No estoy seguro de por qué funciona, pero lo hace. ¿No es ese el peor tipo de error?


Me he topado con esto unas cuantas veces e hice la solución (restableciendo el marco) debido a la presión del tiempo, pero la última vez que lo encontré encontré una solución real. En lugar de crear su controlador de vista de nivel superior en el código (si lo es), intente hacer que se cree en la ventana de UI e IBOutletelo a AppDelegate en su lugar.

Trabajó para mi.


Para mí, mi controlador de vista modal era un MoviePlayer y cuando se presentaba, parecía que la barra de estado se volvería a dibujar. Cuando se descartó la vista, esta segunda barra de estado de alguna manera crearía un desplazamiento de 20px en la parte inferior de la pantalla, justo encima del controlador de tabbar.

Para solucionar esto, cuando se presentó el controlador de vista modal, ocultaría la barra de estado. Cuando la película terminó de reproducirse y el controlador de vista modal iba a ser descartado, hice visible la barra de estado.

- (void) moviePlayerLoadStateChanged:(NSNotification*)notification { [[UIApplication sharedApplication] setStatusBarHidden:YES]; } - (void) moviePlayBackDidFinish:(NSNotification*)notification { [[UIApplication sharedApplication] setStatusBarHidden:NO]; }


Probablemente podría colocar este código cuando descarte el UIImagePickerController.

self.view.frame = CGRectMake(0, 0, 320, 480);


Resulta que esto estaba sucediendo porque estaba llamando a mi modalviewcontroller en el controlador de vista actual, pero mi controlador de vista ya tenía otro controlador de vista cargado como una subvista. Una vez que lo cambié para hacer que el controlador de vista en la subvista, cargar el modal, luego se fue. Gracias por toda tu ayuda.


Solo quería sonar y decir que tenía el problema exactamente opuesto: un espacio blanco en la parte inferior de la pantalla. Y la solución también fue lo opuesto, presenté desde una subvista, cuando tenía que presentarla desde el padre. ¡Gracias!


Tenía exactamente el mismo problema ... ¿mi solución? Establezca manualmente el alto de la vista que está mostrando modalmente a 480 px en el constructor de interfaz.

Problema resuelto.


Utilicé la respuesta de @Mark Hammonds, pero simplemente restablecí el desplazamiento del marco en 0, es decir:

// this won''t be called on the parent view if a modal dialog is dismissed. [self.parentViewController viewWillAppear: animated]; // actually dismiss the modal dialog. [[TOSplitViewController active] dismissModalViewControllerAnimated: animated]; // fix the mysterious white bar that appeared on the top. [[TOSplitViewController active].view setFrame:CGRectMake(0,0, [TOSplitViewController active].view.frame.size.width, [TOSplitViewController active].view.frame.size.height)];

Como se puede adivinar, esto fue mientras trataba de descartar un diálogo modal presentado en la parte superior de una vista dividida en una aplicación de iPad.

Intenté la respuesta de @ Tyler, y no funcionó para mí.

Esto en iOS4.1, apuntando al iPad 3.2.


Yo tuve el mismo problema. Mi solución fue cerrar temporalmente la barra de estado justo antes de cambiar de vista:

- (void) temporarilyHideStatusBar { [[UIApplication sharedApplication] setStatusBarHidden:YES]; [self performSelector:@selector(showStatusBar) withObject:nil afterDelay:0]; } - (void) showStatusBar { [[UIApplication sharedApplication] setStatusBarHidden:NO]; } // Use these by calling the hide function just before a broken view switch: [self temporarilyHideStatusBar]; [self doViewSwitch]; // No need to call [self showStatusBar]; explicitly.

Experimenté con otras soluciones basadas en código, y esta me gusta más porque funciona el 100% del tiempo, algunas de las soluciones basadas en marcos solo funcionan la mayor parte del tiempo y porque tiene efectos mínimos visibles para el usuario.

Sospecho que esto es un error de Apple, y sería bueno escuchar la palabra oficial de ellos sobre la mejor solución.