web-dev-qa-db-fra.com

UIActionSheet de Popover avec iOS8 GM

Quelqu'un reçoit ce message en essayant de montrer UIActionSheet de popover?

Votre application a présenté un UIAlertController () de style UIAlertControllerStyleActionSheet. Le modalPresentationStyle d'un UIAlertController avec ce style est UIModalPresentationPopover. Vous devez fournir des informations de localisation pour ce popover via popoverPresentationController du contrôleur d'alerte. Vous devez fournir un sourceView et sourceRect ou un barButtonItem. Si ces informations ne sont pas connues lorsque vous présentez le contrôleur d'alertes, vous pouvez les fournir dans la méthode UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation.

Avant la GM, j’avais utilisé une solution de contournement pour convertir UIActionSheet en UIAlertController et cela fonctionnait très bien . Cependant, il semble que Apple ait essayé de résoudre les problèmes de UIActionSheet et je ne voulais pas utiliser ma solution de contournement - mais il semble que je n'ai pas le choix ...

45
Tomer Peled

Pour prendre en charge l'iPad, incluez ce code:

alertView.popoverPresentationController?.sourceView = self.view
alertView.popoverPresentationController?.sourceRect = self.view.bounds
// this is the center of the screen currently but it can be any point in the view

self.presentViewController(alertView, animated: true, completion: nil)
101
Philip Jang

Si vous présentez la feuille d'action après que l'utilisateur a effectué une sélection sur une cellule dans une UITableView. J'ai trouvé que cela fonctionne décemment bien:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Directions" 
                                                               message:@"Select mode of transportation:"
                                                        preferredStyle:UIAlertControllerStyleActionSheet];
alert.popoverPresentationController.sourceView = cell;
alert.popoverPresentationController.sourceRect = cell.bounds;
UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
//...
[self presentViewController:alert animated:YES completion:nil];
11
Stunner

Vous devez fournir popoverPresentationController pour iPad. Dans ce cas, vous spécifiez barButtonItem ou sourceView. Cette autre discussion peut vous aider: Swift UIAlertController - ActionSheet iPad iOS8 Crashes

7
Angel Jonathan

En fait, c’est quelque chose de buggé (je crois) dans Xcode pour iPhone et iPad.

  1. Sur iPhone, le même code fonctionne parfaitement et vous pouvez voir le message d'alerte à la même position (toujours). Mais pour iPad, vous devez définir la position de la boîte d’alerte avec alert.popoverPresentationController.sourceView = self.view; alert.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0 - 105, self.view.bounds.size.height / 2.0 + 70, 1.0, 1.0);105 et 70, soit les différences de dimensions approximatives pour la conception de portraits sur iPad en raison du point d’ancrage différent.
  2. Dans la conception de l'iPhone, UIAlertController est fourni avec la 'vue modale', mais malheureusement, si vous utilisez le même code pour iPad, il ne s'agira pas d'une 'vue modale'. Cela signifie que vous devez écrire du code supplémentaire pour désactiver les touches dans la conception de l'iPad. Je pense que c'est bizarre.
  3. Dans la conception iPad, vous devez considérer que le point d'ancrage est différent. Il s’agit du triangle en bulle et non de la partie supérieure gauche d’AlertView.

Ce sont les choses étranges que je vois. Je pense qu'il doit y avoir une norme et si quelqu'un veut établir des normes, très bien, il peut y avoir d'autres options.

2
icould

UIAlertController étant uniquement iOS8 et devant prendre en charge iOS7, je l'utilise. Je me suis heurté à cela dans une vue principale dans une disposition maître/détail sur iPad. J'ai pu contourner ce problème (pas exactement le corriger) en soulevant la feuille UIActionSheet à partir du parent UISplitViewController à l'aide de [actionSheet showInView:]. Bonne chance.

1
Adam Jack

Si vous souhaitez le présenter au centre sans flèches sur les iPad et normalement sur les iPhones: [ Swift 3+ ]:

if let popoverController = alertController.popoverPresentationController {
    popoverController.sourceView = self.view
    popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
    popoverController.permittedArrowDirections = []
}
self.present(alertController, animated: true, completion: nil)
0
Mohit Singh