2010-09-24 12 views
5

Tengo una situación, he creado dos plumillas diferentes, una en modo retrato y otra en modo paisaje. Tenía muchos diseños en la vista, así que tuve que optar por dos puntas diferentes. Ahora, quiero cambiar las puntas como la interfaz gira en laQuiero usar múltiples plumillas para diferentes orientaciones de interfaz iphone

viewController común

para que pueda retener a los valores introducidos y el estado de los controles que tengo en la vista.

En este momento estoy usando

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Override to allow orientations other than the default portrait orientation. 
if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight){ 
    [self initWithNibName:@"LandscapeNib" bundle:nil]; 
}else if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){ 
    [self initWithNibName:@"PortraitNib" bundle:nil]; 

} 


return YES; 

}

pero no cambia la plumilla, que muestra la punta de carga inicial. Supongo que se está cargando pero no se muestra porque la punta inicial ya se está mostrando, no se elimina. No puedo encontrar la solución de trabajar con múltiples plumillas con un controlador de vista común para que pueda manejar fácilmente la funcionalidad de los controles.

Respuesta

2

No puede iniciarse de nuevo una vez que el auto ha sido iniciado.

Cuando se gira, que se necesitan para:

  1. Uso loadNibNamed:owner:options: a carga de la punta con la mano en un NSArray. (Ver the documention).
  2. Establezca self.view al objeto en el índice 0 de esa matriz.
+0

Incluso cuando esto podría funcionar, no recomiendo reemplazar la vista del controlador. Suena sucio, presenta una situación frágil en la que es fácil cometer errores al soltar y retener objetos correctamente. – Michal

+0

En realidad, reemplazar la vista de los controladores será mucho mejor si se espera que el usuario vuelva a girar el dispositivo. No usa tanta memoria, además la rotación será más rápida. Además, si ambas vistas son objetos de clase, pueden desasignarse y liberarse con el controlador de vista. – MishieMoo

5

shouldAutorotateToInterfaceOrientation: debería simplemente regresar con un SÍ o un NO. En mi experiencia, no es una buena idea hacer ningún procesamiento extendido aquí. A partir de los documentos:

Su puesta en práctica de este método debe devuelva SÍ o NO basa sobre el valor en el parámetro interfaceOrientation. No intente obtener el valor de la propiedad interfaceOrientation o compruebe el valor de orientación informado por la clase UIDevice. Su controlador de vista es capaz de soportar una orientación dada o no lo es.

Un mejor lugar para cargar sus puntas en respuesta a una rotación del dispositivo sería

willRotateToInterfaceOrientation:duration: o didRotateToInterfaceOrientation:

6

Debe crear una vista-controlador especial para el modo horizontal, y la presentan de forma modal cuando el dispositivo gira Para recibir notificaciones cuando el dispositivo gira, regístrese para recibir notificaciones UIDeviceOrientationDidChangeNotification.

Para vistas tan complejas que deben presentarse de forma diferente en vertical y horizontal, Apple recomienda esta forma de implementación.Lea aquí para más detalles:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101-SW26

He aquí un fragmento de la documentación de Apple. Registrar las notificaciones en su inicio o awakeFromNib:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
          selector:@selector(orientationChanged:) 
          name:UIDeviceOrientationDidChangeNotification 
          object:nil]; 

y en orientationChanged actuales su vista-controlador paisaje de forma modal, o descartarlo, todo de acuerdo a la rotación actual:

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && 
     !isShowingLandscapeView) 
    { 
     [self presentModalViewController:self.landscapeViewController 
           animated:YES]; 
     isShowingLandscapeView = YES; 
    } 
    else if (deviceOrientation == UIDeviceOrientationPortrait && 
      isShowingLandscapeView) 
    { 
     [self dismissModalViewControllerAnimated:YES]; 
     isShowingLandscapeView = NO; 
    } 
} 
-2

que tenía que hacer lo mismo para mi propia aplicación y finalmente terminé con una clase específica UIAutoRotateView que manejará eso por ti.

ver explicación here

Espero que esto ayude.

+1

Las respuestas que solo contienen enlaces son [consideradas malas prácticas] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). Resuma el contenido aquí (no copie/pegue) para que la respuesta pueda ser independiente. Si no lo hace, corre el riesgo de que su respuesta sea eliminada, especialmente si el enlace alguna vez muere. Además, revise la [faq # promotion] al vincular a su propio blog. –

Cuestiones relacionadas