UIPopoverPresentationController sur iOS 8 iPhone

est-ce que quelqu'un sait si UIPopoverPresentationController peut être utilisé pour présenter des popovers sur iPhones? Je me demande si Apple a ajouté cette fonctionnalité sur iOS 8 dans leur tentative de créer des contrôleurs de présentation plus unifiés pour iPad et iPhone.

Je ne sais pas si C'est correct de poser/répondre aux questions de Beta. Je vais l'enlever dans ce cas.

71
demandé sur Andriy 2014-08-15 03:31:57

7 réponses

vous pouvez outrepasser le comportement adaptatif par défaut ( UIModalPresentationFullScreen dans un environnement horizontal compact, i.e. iPhone) en utilisant le adaptivePresentationStyleForPresentationController: méthode disponible par UIPopoverPresentationController.delegate .

UIPresentationController utilise cette méthode pour demander le nouveau style de présentation à utiliser, qui dans votre cas, en retournant simplement UIModalPresentationNone causera le UIPopoverPresentationController à rendre comme un popover au lieu de plein écran.

voici un exemple de popover utilisant une configuration de segue dans storyboard de A UIBarButtonItem à " modérément présent " a UIViewController

class SomeViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    // override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { // swift < 3.0
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "PopoverSegue" {
            if let controller = segue.destinationViewController as? UIViewController {
                controller.popoverPresentationController.delegate = self
                controller.preferredContentSize = CGSize(width: 320, height: 186)                
            }
        }
    }

    // MARK: UIPopoverPresentationControllerDelegate

    //func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle { // swift < 3.0
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        // Return no adaptive presentation style, use default presentation behaviour
        return .None
    }
}

cette astuce a été mentionnée dans WWDC 2014 session 214 "voir L'avancement du contrôleur dans iOS8" (36:30)

80
répondu Ivan Choo 2017-02-14 11:47:17

si quelqu'un veut présenter un popover avec code seulement, vous pouvez utiliser l'approche suivante.

OBJECTIF-C

déclarer un bien de UIPopoverPresentationController :

@property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8;

utilisez la méthode suivante pour présenter le popover de UIButton:

- (IBAction)btnSelectDatePressed:(id)sender
{
    UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];/*Here dateVC is controller you want to show in popover*/
    dateVC.preferredContentSize = CGSizeMake(280,200);
    destNav.modalPresentationStyle = UIModalPresentationPopover;
    _dateTimePopover8 = destNav.popoverPresentationController;
    _dateTimePopover8.delegate = self;
    _dateTimePopover8.sourceView = self.view;
    _dateTimePopover8.sourceRect = sender.frame;
    destNav.navigationBarHidden = YES;
    [self presentViewController:destNav animated:YES completion:nil];
}

utilisez la méthode suivante pour présenter le popover de UIBarButtonItem:

- (IBAction)btnSelectDatePressed:(id)sender
{
    UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];/*Here dateVC is controller you want to show in popover*/
    dateVC.preferredContentSize = CGSizeMake(280,200);
    destNav.modalPresentationStyle = UIModalPresentationPopover;
    _dateTimePopover8 = destNav.popoverPresentationController;
    _dateTimePopover8.delegate = self;
    _dateTimePopover8.sourceView = self.view;
     CGRect frame = [[sender valueForKey:@"view"] frame];
    frame.origin.y = frame.origin.y+20;
    _dateTimePopover8.sourceRect = frame;
    destNav.navigationBarHidden = YES;
    [self presentViewController:destNav animated:YES completion:nil];
}

implémenter cette méthode delegate aussi dans votre contrôleur de vue:

- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
    return UIModalPresentationNone;
}

pour rejeter ce popover, il suffit de rejeter le contrôleur de vue. Ci-dessous le code pour rejeter le contrôleur de vue:

-(void)hideIOS8PopOver
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

SWIFT

utilisez la méthode suivante pour présenter le popover D'UIButon:

func filterBooks(sender: UIButon)
    {
        let filterVC =  FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil)
        var filterDistanceViewController = UINavigationController(rootViewController: filterVC)
        filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205)
        let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController
        popoverPresentationViewController?.permittedArrowDirections = .Any
        popoverPresentationViewController?.delegate = self
        popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem
        popoverPresentationViewController!.sourceView = self.view;
        popoverPresentationViewController!.sourceRect = sender.frame

        filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
        filterDistanceViewController.navigationBarHidden = true
        self.presentViewController(filterDistanceViewController, animated: true, completion: nil)
    }

utilisez la méthode suivante pour présenter le popover de UIBarButtonItem:

func filterBooks(sender: UIBarButtonItem)
    {
        let filterVC =  FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil)
        var filterDistanceViewController = UINavigationController(rootViewController: filterVC)
        filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205)
        let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController
        popoverPresentationViewController?.permittedArrowDirections = .Any
        popoverPresentationViewController?.delegate = self
        popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem
        popoverPresentationViewController!.sourceView = self.view;
        var frame:CGRect = sender.valueForKey("view")!.frame
        frame.origin.y = frame.origin.y+20
        popoverPresentationViewController!.sourceRect = frame

        filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
        filterDistanceViewController.navigationBarHidden = true
        self.presentViewController(filterDistanceViewController, animated: true, completion: nil)
    }

implémenter cette méthode delegate aussi dans votre contrôleur de vue:

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle{
        return .None
    }

s'il vous Plaît assurez-vous d'ajouter délégué UIPopoverPresentationControllerDelegate .h./m./swift fichier

70
répondu Desert Rose 2016-05-09 10:02:04

problème: iPhone popover affiche plein écran et ne respecte pas preferredContentSize valeur.

SOLUTION: contrairement à ce qu'Apple suggère dans la référence de classe UIPopoverPresentationController, présentant le contrôleur de vue après obtenir une référence au contrôleur de présentation popover et le configurer.

// Get the popover presentation controller and configure it.
//...

// Present the view controller using the popover style.
[self presentViewController:myPopoverViewController animated: YES completion: nil]; 
9
répondu agandi 2016-01-18 10:58:52

j'ai trouvé une solution.

Sur Xcode6.1, utilisez presentationController.delegate au lieu de popoverPresentationController.delegate .

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier compare:@"showPopOver"] == NSOrderedSame) {
        UINavigationController * nvc = segue.destinationViewController;
        UIPresentationController * pc = nvc.presentationController;
        pc.delegate = self;
    }
}

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

dans WWDC 2014 "voir les progrès du contrôleur dans iOS8", ci-dessous les codes peuvent afficher popover sur iPhone.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    UINavigationController * nvc = segue.destinationViewController;
    UIPopoverPresentationController * pvc = nvc.popoverPresentationController;
    pvc.delegate = self;
}

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

mais sur Xcode 6.1, ces codes montrent une présentation en plein écran... (cnv.popoverPresentationController est nul),

je doute que ce soit un bug D'Apple.

2
répondu nomadmonad 2014-12-20 09:15:39

assurez-vous de mettre en œuvre UIAdaptivePresentationControllerdelegate

comme ceci:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    return UIModalPresentationNone;
}

Si vous ne voulez pas en plein écran popovers

2
répondu ader 2015-08-12 12:41:51

dans iOS 8.3 et plus tard, utilisez la syntaxe suivante dans le protocole UIPopoverPresentationControllerDelegate pour outrepasser votre popup UIModalPresentationStyle .

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return .none
}
1
répondu adaria 2016-12-07 21:58:59

ajoutez ces deux méthodes dans votre classe WEBVIEW. et ajouter

-(void) prepareForSegue: (UIStoryboardSegue * ) segue sender: (id) sender {
    // Assuming you've hooked this all up in a Storyboard with a popover presentation style
    if ([segue.identifier isEqualToString: @"showPopover"]) {
        UINavigationController * destNav = segue.destinationViewController;
        pop = destNav.viewControllers.firstObject;
        // This is the important part
        UIPopoverPresentationController * popPC = destNav.popoverPresentationController;
        popPC.delegate = self;
    }
}

- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
    return UIModalPresentationNone;
}
0
répondu Mongo db 2014-10-07 11:17:29