2010-09-22 27 views
6

Tengo una aplicación basada en la navegación que tiene una vista de detalle (UIWebView) con botones de acción en la parte inferior de una barra de UIToolbar. Quiero agregar 'notas' cuando se presiona el botón 'notas'. Todo funciona bien cuando la vista web está en modo vertical. Presiono el botón de notas, la vista modal se abre bien y funciona muy bien.El controlador de vista modal no se iniciará en modo horizontal

El problema se produce cuando la vista web está en modo horizontal. Si presiono el botón de notas, se llama a todo el código para abrir la vista modal, pero todo lo que obtengo es una pantalla en blanco. Un comentario: si abro la vista modal en vertical y luego giro el dispositivo, gira perfectamente al modo horizontal. Simplemente no abrir correctamente en modo horizontal.

Tengo otro botón que muestra el compositor de correo que tiene el mismo comportamiento. Aquí está el código en mi UIWebViewController:

- (IBAction)addNotes:(id)sender 
{ 
    NotesViewController *notesViewController; 

    // create the view controller and set it as the root view of a new navigation 
    // controller 

    notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey]; 
    UINavigationController *newNavigationController = 
    [[UINavigationController alloc] initWithRootViewController:notesViewController]; 

    // present the navigation controller modally 

    [self presentModalViewController:newNavigationController animated:YES]; 
    [notesViewController release]; 
    [self.view setNeedsDisplay]; // not sure if I need this! I was trying different things... 
    [self.devotionText setNeedsDisplay]; // ditto... 
    [newNavigationController release]; 
} 

¿Alguna idea? He intentado todo tipo de cosas diferentes en vano. Acabo de obtener una pantalla en blanco sin barra de navegación (aunque hay una barra de estado en la parte superior).

+0

¿Estás utilizando el último sistema operativo? He tenido problemas al presionar una vista modal solo horizontal mientras estaba en retrato en 3.1.3 ... –

+0

Sí, estoy ejecutando el SDK 4.0 ... – Glasswing

Respuesta

-1

No necesita una nueva Navigation Controlle r.

- (IBAction)addNotes:(id)sender { 

NotesViewController *notesViewController; 

// create the view controller and set it as the root view of a new navigation 
// controller 

notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey]; 

[self.navigationController pushViewController: notesViewController animated: YES]; 
[notesViewController release]; 
} 
+0

He eliminado el controlador de navegación y sigo teniendo el mismo comportamiento. Muchas gracias por responder. ¿Alguna otra idea? – Glasswing

7

Los modales no siempre obtienen información acerca de las rotaciones, y obtienen su información de la barra de estado, que no siempre funciona bien. Ponga esto en su punto de vista: Parecer arreglar: [UIApplication sharedApplication].statusBarOrientation = self.interfaceOrientation Y, si quiere un controlador de navegación dentro de su modal, necesita crear uno.

Además, no necesita el setNeedsDisplay. Eso solo afecta los puntos de vista actuales, no el modal que está presentando.

+0

¡Gracias por responder tan rápido! Intenté poner el código statusBarOrientation en mi vista NotesViewControllerWillAppear y todavía obtengo el mismo comportamiento. También eliminé el nuevo controlador de navegación y todavía no obtengo nada ... solo la pantalla blanca. ¿Cualquier otra sugerencia? – Glasswing

+0

¿Puedes publicar algún código para la función initWithPrimaryKey? Publicar un código en ese archivo ayudará inmensamente! – MishieMoo

+0

La función init es simple ... el archivo xib es solo una UIView con una UITextView debajo. – Glasswing

2

Guau, perdí días con ese problema ... ¡pero encontré una solución!

Tuve el mismo problema que tenía: el método "presentModalViewController: animado:" solo funcionó en modo retrato.

Después de muchas pruebas y errores, descubrí que la razón era que tenía varios controles de vista activos al mismo tiempo. Implementé un sistema de navegación que cambiaba entre diferentes controladores de vista, con un padre que manejaba a los niños. (No pude usar UINavigationController, porque necesitaba un aspecto diferente.)

Por lo tanto, mi controlador de vista raíz tenía un objeto de vista raíz y varios controladores de vista secundarios. Cuando se activó un controlador de vista infantil, su objeto de vista se agregó como subvista a la vista del controlador de vista raíz.

El método "presentModalViewController" no le gustó. Sin embargo, tan pronto como establecí la propiedad "parentViewController" de los controladores de vista secundarios, ¡funcionó!

El problema es solo que "parentViewController" es una propiedad de solo lectura. Tienes que extender la clase UIViewController para que puedas acceder a ella.

@interface UIViewController (HelperExtension) 

@property (nonatomic, assign) UIViewController *parent; 

@end 

@implementation UIViewController (HelperExtension) 

- (UIViewController *)parent 
{ 
    return self.parentViewController; 
} 

- (void)setParent:(UIViewController *)parent 
{ 
    [self setValue:parent forKey:@"_parentViewController"]; 
} 

@end 

Por lo tanto, cada vez que agrega el punto de vista de un controlador de vista del niño a su controlador de vista de los padres, llame a la "setParent:" método después de hacerlo. ¡Entonces funcionará!

+0

Esto también funcionó para mí. No estabas utilizando BCTabBarController por ningún cambio, ¿o sí? Tanto problema para aquellas pequeñas flechas animadores ... –

2

Tiene el mismo problema cuando se presenta modalmente un controlador de navegación.Asegúrese de tener correctamente implementar: shouldAutorotateToInterfaceOrientation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    BOOL shouldAutorotate = NO; 
    if(isControllerMangingAllOrientations) 
    { 
     shouldAutorotate = YES; 
    } 
    else 
    { 
     shouldAutorotate = (toInterfaceOrientation == UIInterfaceOrientationPortrait); 
    } 
    return shouldAutorotate; 
} 

yo estaba sentado el booleano en el método viewDidLoad, no es una buena idea. Poniéndolo en el método initWithNibName: bundle: es el lugar correcto.

+0

luchando con este problema exacto y se olvidó de que por defecto XCode 4 es la adición: '- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { retorno (interfaceOrientation == UIInterfaceOrientationPortrait); } ' No es de extrañar que siempre haya sido retrato .... * suspiro * –

0

Si utiliza presentModalViewController sólo para la animación como yo, puede utilizar pushViewController con la animación de la siguiente respuesta;

Showing pushviewcontroller animation look like presentModalViewController

y puede cerrar la viewController de la siguiente manera;

CATransition* transition = [CATransition animation]; 
transition.duration = 0.3; 
transition.type = kCATransitionFade; 
transition.subtype = kCATransitionFromTop; 

[self.navigationController.view.layer addAnimation:transition forKey:kCATransition]; 
[self.navigationController popViewControllerAnimated:NO]; 

creo que sirve ..

0

que tenía la tarea de mostrar un reproductor de vídeo en modo horizontal.

AVPlayerViewController *playerViewController = [AVPlayerViewController new]; 
//Player init code goes here.... 

// #define degreesToRadian(x) (M_PI * (x)/180.0) - was defined previously in a class header 

playerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
playerViewController.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
playerViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 

[self presentViewController:playerViewController animated:YES completion:nil]; 
Cuestiones relacionadas