2010-11-20 18 views
29

Estoy presentando un controlador de vista modal. Si importa, se desplaza hacia arriba desde abajo. ¿Cómo puedo controlar qué parte de la pantalla ocupa?iOS: ¿cómo se controla el tamaño de un controlador de vista modal?

EDITAR: Tengo lo siguiente en el controlador de vista modal. No está ayudando.

- (void)viewDidLoad { 
    TestResultView *trv = [[TestResultView alloc]initWithTest: [Model m].currentTest]; 
    self.view = trv; 
    trv.frame = CGRectMake(0, 320, 320, 160); 
    [trv release]; 
    [super viewDidLoad]; 
} 

Respuesta

38

puede modificar la estructura del controlador de vista, pero si usted está utilizando -presentModalViewController de UIViewController: animada: método, la vista detrás se descarga una vez que su punto de vista modal se terminó la animación en la pantalla (Esto supone estás en un iPhone) y verás una pantalla blanca donde debería estar tu vista de fondo. iOS asume que su controlador de vista modal será un controlador de vista de pantalla completa y volcará la otra vista para ahorrar memoria.

Si realmente desea mostrar una vista sobre parte de la pantalla, en su lugar debe agregar UIView (no UIViewController) a la vista actual de UIViewController como subvista, y luego animarla en pantalla usted mismo. Creo que algo así iba a trabajar en su clase UIViewController que presentará la vista:

// Add the view as a subview and position it offscreen just below the current view 
UIView *myHalfView = [[UIView alloc] initWithFrame:someAppropriateFrame]; 
[self.view addSubview:myHalfView]; 
CGRect offScreenFrame = myHalfView.bounds; 
offScreenFrame.origin = CGPointMake(0.0, CGRectGetMaxY(self.view.frame)); 

// Now animate the view upwards 
[UIView beginAnimations:nil context:nil]; 
// Move the view upwards the height of your sliding view so it's entirely onscreen 
myHalfView.center = CGPointMake(myHalfView.center.x, myHalfView.center.y - myHalfView.bounds.size.height); 
[UIView commitAnimations]; 
[myHalfView release]; 

Para los puntos de bonificación, que podría desaparecer de la vista en estableciendo

myHalfView.alpha = 0.0; 

antes de que el bloque de animación UIView, y configuración

myHalfView.alpha = 1.0; 

dentro del bloque después de animar el centro de la propiedad.

Cuando haya terminado, puede hacer algo similar, pero a la inversa para deslizar la vista fuera de pantalla. Puede agregar un selector animationDidStop al bloque de animación UIView para que se le notifique cuando la vista se haya deslizado fuera de la pantalla para que pueda eliminarla de la jerarquía de vistas.

Desde un punto de vista estético, también debe tener cuidado al hacer esto, ya que tener una vista hacia arriba es un comportamiento estándar, y si su vista se ve como una vista normal pero se detiene, los usuarios pueden sentir (incluso brevemente) que la aplicación se ha congelado. Lo resolverán, pero dejará un mal presentimiento sobre tu aplicación si no se maneja con cuidado. Principalmente, evitaría el uso de señales estándar de pantalla completa, como la inclusión de un UINavigationController en la parte superior de su vista para ayudar a los usuarios a comprender lo que está sucediendo. Las medias láminas tienden a ser UIActionSheets en el iPhone, así que piensa en esa dirección.

+1

Esto hace que funcione en iPad. –

+1

+1, buena solución! Solo uno rápido: a la última línea le falta un paréntesis izquierdo "[". – pille

+1

¡Buena captura, gracias! – atticus

26

Eso es bueno, la respuesta aceptada más arriba explica un truco agradable para presentar subViews que se sienten como ModalViews, pero ¿qué ocurre si se trata de un iPad, y puedo darle un modalViewController que no cubre toda la pantalla.

En el caso de iPads, no creo que se descargue la vista de abajo. (porque hay opciones donde podemos presentar modalView en iPads, que no cubren toda la pantalla)

ModalViewController al final es un controlador en sí mismo, y como cualquier otro controlador tiene una vista raíz, cuyas propiedades se pueden editar, si podemos conseguirlo.

Esto es lo que le dará un marco de encargo de la ModalView:

MyViewController *viewController = [[MyViewController alloc] init]; 
viewConroller.modalPresentationStyle = UIModalPresentationFormSheet; 
[self presentModalViewController:viewController animated:YES]; 
    //superView of viewController's view is modalViewController's view, which we were after 
viewController.view.superview.frame = CGRectMake(x,y,w,h); 
    //x y w h - can have desired values. 
20

me gustaría añadir a la respuesta de @ DSAW que no parece que el supervista de la vista modal para girar su sistema de coordenadas en el modo horizontal.Aquí está el código que he usado en mi propia aplicación:

MyViewController* modalVC = [[MyViewController alloc] init];   
modalVC.modalPresentationStyle = UIModalPresentationFormSheet; 
[self presentModalViewController:modalVC animated:NO]; 
CGRect r = CGRectMake(self.view.bounds.size.width/2 - 236, 
         self.view.bounds.size.height/2 - 130, 
         472, 260); 
r = [self.view convertRect:r toView:modalVC.view.superview.superview]; 
modalVC.view.superview.frame = r; 

Mientras que el supervista no puede girar en sí con el iPad, parece que hacer las cosas bien y mantener la vista modal centrada si puedo girar el iPad después mostrando la vista modal.

+1

genial, pero ¿qué método de la vista padre se llama cuando tal vista se descarta? la vista del padre viewdidappear por ejemplo no se llamará ... – user944351

+0

Esto funcionó bien para mí. La mejor solución que he visto para vistas modales de tamaño personalizado. Lástima que no puedas hacerlo con segues (por lo que puedo deducir. Experimenté algunos). –

+0

Hola bugloaf, hice lo mismo y funciona bien para ViewControllers solo, pero para ViewControllers con navegación no es así. Responda mi pregunta @ http://stackoverflow.com/questions/15802633/presenting-a-view-controller-of-custom-size-with-navigation – satheeshwaran

Cuestiones relacionadas