2009-09-30 25 views
7

Me gustaría crear una subclase UIViewController reutilizable que se pueda mostrar como un controlador de vista modal sobre cualquier otro controlador de vista. Una de las primeras cosas que debe hacer este VC reutilizable es abrir una UIActionSheet. Para hacer esto, creo una vista predeterminada (en blanco) en mi VC para mostrar la hoja de acción.¿Cómo puedo crear un UIViewController modal translúcido?

Sin embargo, esto se ve mal porque, cuando aparece el vc modal, el vc principal está oculto. Por lo tanto, parece que la hoja de acción está flotando sobre un fondo en blanco. Sería mejor si la hoja de acción pudiera aparecer para mostrar el vc original (principal).

¿Hay alguna manera de lograrlo? ¿Es seguro simplemente tomar la vista de vc padre y animar la UIActionSheet de eso?

+0

que tienen el mismo problema. ¿Alguna solución? – Frade

Respuesta

0

Puede simplemente mostrarlo en su controlador de vista principal insertando vista en una vista principal.

Algo como esto:

PseudoModalVC *vc = ...//initialization 
vc.view.backgroundColor = [UIColor clearColor]; // like in previous comment, although you can do this in Interface Builder 
vc.view.center = CGPointMake(160, -vc.view.bounds.size.height/2); 
[parentVC.view addSubView:vc.view]; 

// animation for pop up from screen bottom 
[UIView beginAnimation:nil context:nil]; 
vc.view.center = CGPointMake(160, vc.view.bounds.size.height/2); 
[UIView commitAnimation]; 
+1

Si hace esto, también deberá realizar todas las llamadas apropiadas a métodos como "viewWillAppear" en el controlador de visualización que se muestra. UINavigationController y el sistema modal se encargan de esto normalmente. – DougW

-1

Sip. Añádalo a la vista del controlador de la vista actual (o como una subvista de la ventana) y anímalo en la pantalla como decía Valerii.

para quitarlo con una animación, hacer esto (estoy asumiendo el punto de vista modal es de 320 x 460 y que pueda deslizarse hacia abajo de la pantalla):

- (void)dismissModal 
{ 
    // animate off-screen 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [UIView setAnimationDuration:0.50]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 

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

    [UIView commitAnimations]; 
} 

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    // don't remove until animation is complete. otherwise, the view will simply disappear 
    [self.view removeFromSuperview]; 
} 
14

Después de su punto de vista modal en anima, se se cambia de tamaño para que sea igual en tamaño a su vista principal. Lo que puede hacer es dentro de su viewDidAppear :, toma una fotografía de la opinión de la parentController, a continuación, insertar un UIImageView que contiene la imagen del padre en la parte posterior de la lista de subvistas de su propio punto de vista:

#pragma mark - 
#pragma mark Sneaky Background Image 
- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    // grab an image of our parent view 
    UIView *parentView = self.parentViewController.view; 

    // For iOS 5 you need to use presentingViewController: 
    // UIView *parentView = self.presentingViewController.view; 

    UIGraphicsBeginImageContext(parentView.bounds.size); 
    [parentView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *parentViewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // insert an image view with a picture of the parent view at the back of our view's subview stack... 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; 
    imageView.image = parentViewImage; 
    [self.view insertSubview:imageView atIndex:0]; 
    [imageView release]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    // remove our image view containing a picture of the parent view at the back of our view's subview stack... 
    [[self.view.subviews objectAtIndex:0] removeFromSuperview]; 
} 
+1

Para iOS 5, necesita usar 'presentingViewController' en lugar de' parentViewController'. Actualicé tu respuesta para incluir eso. –

+0

Esto funciona principalmente de maravilla, pero cuando lo intento obtengo un espacio de 20 px en la parte superior de la imagen de vista principal provocada (supongo) por la barra de estado. Alguna sugerencia para corregir eso? – Mac

+0

Actualización: He logrado una solución al traducir mi contexto de imagen 20 píxeles hacia arriba, pero todavía tengo curiosidad de por qué tuve que hacerlo cuando parece que nadie más lo ha hecho. – Mac

Cuestiones relacionadas