Implementación de Vistas Popover con UIPopoverPresentationController en iOS

En el desarrollo de aplicaciones para iOS, frecuentemente surge la necesidad de mostrar vistas emergentes con flechas que apunten a elementos específicos, como botones. UIPopoverPresentationController es la clase responsable de gestionar estas vistas popover.

Mecanismo de Gestión

Una vista popover con flecha es controlada por una instancia de UIPopoverPresentationController, que administra su apariencia y configuraciones. Para utilizarlo, no se crea directamente; en cambio, se establece el estilo de presentación modal del controlador de vista a UIModalPresentationPopover. Esto automáticamente asigna una propiedad popoverPresentationController al controlador, la cual es de tipo UIPopoverPresentationController y permite personalizar el popover.

Delegaod UIPopoverPresentationControllerDelegate

El delegado de UIPopoverPresentationController recibe notificaciones durante el ciclo de vida del popover. Los métodos clave son:

  • prepareForPopoverPresentation: – Invocado justo antes de que el popover se muestre.
  • popoverPresentationControllerShouldDismissPopover: – Permite o bloquea la ocultación del popover.
  • popoverPresentationControllerDidDismissPopover: – Llamado después de que el popover se ha cerrado.

Configuración de Propiedades

Las propiedades fundamentales de UIPopoverPresentationController incluyen:

  • backgroundColor: Establece el color de fondo del contenedor del popover.
  • passthroughViews: Un arreglo de vistas que siguen siendo interactivas incluso con el popover visible.
  • sourceView: La vista de referencia a la que apunta la flecha del popover.
  • sourceRect: El área dentro de la sourceView que determina la posición precisa de la flecha.
  • permittedArrowDirections: Un enumerado que define las direcciones válidas para la flecha, como UIPopoverArrowDirectionRight.
  • canOverlapSourceViewRect: Valor booleano que indica si el popover puede superponerse al sourceRect.

Por ejemplo, ajustar sourceRect a la mitad inferior de un botón modificará la ubicación de la flecha para apuntar a esa zona específica.

Ejemplo Práctico

A continuación, se presenta un fragmento de código en Objective-C para configurar y presentar un popover:

InfoViewController *infoVC = [[InfoViewController alloc] init];
infoVC.preferredContentSize = CGSizeMake(180, 180);
infoVC.modalPresentationStyle = UIModalPresentationPopover;
infoVC.popoverPresentationController.delegate = self;
infoVC.popoverPresentationController.sourceView = menuButton;
infoVC.popoverPresentationController.sourceRect = CGRectMake(menuButton.bounds.size.width / 4.0, 0, menuButton.bounds.size.width / 2.0, menuButton.bounds.size.height);
infoVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionDown;
infoVC.popoverPresentationController.backgroundColor = [UIColor systemBackgroundColor];
infoVC.popoverPresentationController.canOverlapSourceViewRect = NO;
[self presentViewController:infoVC animated:YES completion:nil];

Para garantizar que el popover se muestre correctamente en entornos con espacio limitado, es esencial implementar el siguiente método delegado:

#pragma mark - UIPopoverPresentationControllerDelegate
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    return UIModalPresentationNone;
}

Este método previene que el popover se adapte a una presentación de pantalla completa en dispositivos compactos.

Etiquetas: UIPopoverPresentationController iOS uikit Objective-C Delegado

Publicado el 7-28 21:22