2011-08-08 15 views
5

¿Hay alguna manera de agregar un botón en la esquina de UIModalPresentationPageSheet? Quiero decir, quiero poner ese botón tipo Apple (x) en la esquina de una Hoja de páginas, pero agregarlo a la vista principal hace que aparezca detrás de la Hoja de páginas (y también imposible de tocar) y agregarlo a la Página Sheet hará que una parte quede oculta, ya que está fuera del área de visualización.Añadir botón de cerrar a UIModalPresentationPageSheet esquina

¿Hay una solución?

Gracias.

+0

¿Qué quiere decir por "de añadir a la Hoja hará que parte de ella oculta, ya que está fuera del área de la vista."? –

Respuesta

1

Aquí hay una solución que yo uso. No es exactamente lo que describes, lo que también sería bueno, pero sería complicado ya que querrías que el botón estuviera parcialmente fuera de los límites de la vista (como dices, tendría que ser un elemento secundario del controlador de vista). vista de la vista).

Mi solución es poner un botón de cierre en el área del botón izquierdo de una barra de navegación. Lo hago automágicamente a través de una extensión de clase UIViewController. Para usarlo, solo llame a [currentViewController presentAutoModalViewController: modalViewController animated: YES];

@implementation UIViewController (Modal) 

- (void) presentAutoModalViewController: (UIViewController *) modalViewController withDismissAction: (SEL) onDismiss animated:(BOOL)animated 
{ 
    UINavigationController* nc = nil; 
    if (NO == [ modalViewController isKindOfClass: [UINavigationController class]]) 
    { 
     nc = [[[UINavigationController alloc] initWithRootViewController: modalViewController] autorelease]; 

     [nc setToolbarHidden:YES animated: NO]; 

     nc.modalPresentationStyle = modalViewController.modalPresentationStyle; 

     modalViewController.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop 
                               target:self 
                               action:onDismiss] autorelease]; 
    } 
    else 
    { 
     nc = (UINavigationController*) modalViewController; 

     UIViewController* rootViewController = [nc.viewControllers objectAtIndex: 0]; 
     rootViewController.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop 
                               target:self 
                               action:onDismiss] autorelease]; 
    } 

    [nc setNavigationBarHidden: NO]; 
    nc.navigationBar.barStyle = UIBarStyleBlack; 
    nc.toolbar.barStyle = self.navigationController.navigationBar.barStyle; 

    [self presentModalViewController: nc animated: animated ]; 
} 

- (void) presentAutoModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated 
{ 
    [self presentAutoModalViewController:modalViewController withDismissAction: @selector(autoModalViewControllerDismiss:) animated: animated]; 
} 

- (void) autoModalViewControllerDismiss: (id)sender 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (BOOL) isAutoModalViewController 
{ 
    return (self.navigationController != nil && self.navigationController.parentViewController != nil && self.navigationController.parentViewController.modalViewController == self.navigationController); 
} 

@end 
0

EDITAR: En realidad, lo primero que le sugiero que haga es usar un tipo diferente de botón de cerrar. Puede, por ejemplo, agregar una barra de herramientas en la parte superior con un botón Done.

Si aún desea la X flotante estilo Apple, intente configurar las propiedades para asegurarse de que no se oculte ni recorte. Diría que la mejor manera de hacer esto sería crear un UIButton con una imagen de primer plano que es la imagen de botón de estilo, y una imagen de fondo que se desvanece del color/patrones de fondo de la hoja de página a un fondo transparente alrededor del botón. Efectivamente le da un "botón de cierre flotante" sin tener que salir de los límites de la página.

+1

clipsHerramientas no tiene ningún efecto en la vista que se muestra dentro de la hoja de página porque no puede extenderse más allá de los límites de la hoja de página. –

0

Encontré la sugerencia de @ TomSwift muy útil. Aquí hay una versión que usa los métodos iOS7 no desaprobados y ARC.

@implementation UIViewController (Modal) 

- (void)presentAutoModalViewController: (UIViewController *) modalViewController withDismissAction:(SEL) onDismiss animated:(BOOL)animated 
{ 
    UINavigationController* nc = nil; 
    if (NO == [ modalViewController isKindOfClass: [UINavigationController class]]) 
    { 
     nc = [[UINavigationController alloc] initWithRootViewController: modalViewController]; 
     [nc setToolbarHidden:YES animated: NO]; 
     nc.modalPresentationStyle = modalViewController.modalPresentationStyle; 

     modalViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop 
                               target:self 
                               action:onDismiss]; 
    } 
    else 
    { 
     nc = (UINavigationController*) modalViewController; 

     UIViewController* rootViewController = [nc.viewControllers objectAtIndex: 0]; 
     rootViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop 
                              target:self 
                              action:onDismiss]; 
    } 

    [nc setNavigationBarHidden: NO]; 
    nc.navigationBar.barStyle = UIBarStyleBlack; 
    nc.toolbar.barStyle = self.navigationController.navigationBar.barStyle; 

    [self presentViewController:nc animated:animated completion:nil]; 
} 

- (void)presentAutoModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated 
{ 
    [self presentAutoModalViewController:modalViewController withDismissAction: @selector(autoModalViewControllerDismiss:) animated: animated]; 
} 

- (void)autoModalViewControllerDismiss: (id)sender 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (BOOL)isAutoModalViewController 
{ 
    return (self.navigationController != nil && self.navigationController.parentViewController != nil && self.navigationController.parentViewController.presentedViewController == self.navigationController); 
} 

@end 

Y lo llamo como ...

MyController *vc = [[MyController alloc] init]; 
vc.modalPresentationStyle = UIModalPresentationFormSheet; 
vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentAutoModalViewController:info animated:YES]; 
Cuestiones relacionadas