2010-04-20 23 views
6

The documentation dice que si quiero apoyar tanto vertical como horizontal, Tengo básicamente dos maneras de hacerlo:¿Cómo cargar diferentes XIB para diferentes orientaciones de dispositivo para el mismo controlador de vista?

  1. configurar la visión del viewcontroller de manera que los subvistas AUTORESIZE correctamente y hacer cambios más pequeños mediante programación en tiempo de ejecución
  2. Si los cambios son más sustancial, create an alternative landscape interface y push/pop el viewcontroller modal en tiempo de ejecución alternativa

me gustaría presentar la información, donde el diseño es sustancialmente diferente, pero la lógica es la misma. Idealmente, cargaría otro XIB para el mismo controlador de vista, pero no parece ser una opción.

Suena como # 2 lo que tengo que hacer, pero mi problema con eso es que parece que usaría las animaciones de modalviewcontroller estándar que no tienen nada que ver con la animación de rotación del dispositivo. (Por supuesto, siendo el perezoso que soy, no probé esta hipótesis.)

Entonces, ¿cómo cargo un diseño alternativo para el paisaje con el mismo controlador de visualización pero XIB diferente? ¿Debo usar el método n. ° 2 anterior y la animación de rotación es natural? ¿O hay alguna otra manera?

Respuesta

1

que instanciar mis UIView casos en los -viewDidLoad: y agregarlos como subvistas a view la propiedad del controlador de vista:

- (void) viewDidLoad { 
    [super viewDidLoad]; 

    self.myView = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 280.0f, 210.0f)] autorelease]; 
    // ... 
    [self.view addSubview:myView]; 
} 

entonces yo llamo -viewWillAppear: para centrar los subvistas:

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]]; 
} 

también puedo reemplazar -willRotateToInterfaceOrientation:duration:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)newInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self adjustViewsForOrientation:newInterfaceOrientation]; 
} 

El método -adjustViewsForOrientation: establece el centro de CGPoint de varios objetos subvista, dependiendo de la orientación del dispositivo:

- (void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation { 
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { 
     myView.center = CGPointMake(235.0f, 42.0f); 
     // ... 
    } 
    else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) { 
     myView.center = CGPointMake(160.0f, 52.0f); 
     // ... 
    } 
} 

Cuando se carga el controlador de vista, los UIView casos se crean y se coloca basan en la orientación actual del dispositivo. Si el dispositivo se gira posteriormente, las vistas se vuelven a centrar en nuevas coordenadas.

Para hacerlo más suave, probablemente se podría usar una animación con clave en -adjustViewsForOrientation:, de modo que las subvistas se muevan con mayor gracia de un centro a otro. Pero lo anterior funciona para mí, por ahora.

Cuestiones relacionadas