UIPopoverPresentationController su iOS 8 iPhone

Qualcuno sa se UIPopoverPresentationController può essere utilizzato per presentare i popover sugli iPhone? Mi chiedo se Apple abbia aggiunto questa funzione su iOS 8 nel tentativo di creare controller di presentazione unificati per iPad e iPhone.

Non sono sicuro se è OK chiedere / rispondere alle domande da Beta. Lo rimuoverò in quel caso.

    È ansible sovrascrivere il comportamento adattivo predefinito ( UIModalPresentationFullScreen in un ambiente orizzontale compatto, ovvero iPhone) utilizzando adaptivePresentationStyleForPresentationController: metodo disponibile tramite UIPopoverPresentationController.delegate .

    UIPresentationController utilizza questo metodo per chiedere il nuovo stile di presentazione da utilizzare, che nel tuo caso, semplicemente restituendo UIModalPresentationNone farà sì che UIPopoverPresentationController rendering come popover anziché a schermo intero.

    Ecco un esempio del popover che utilizza un’impostazione di follow in storyboard da un UIBarButtonItem per ” presentare modalmente ” un 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 } } 

    Questo trucco è stato menzionato nella sessione 214 del WWDC 2014 “View Controller Advancement in iOS8” (36:30)

    Se qualcuno vuole presentare un popover con solo codice, puoi usare il seguente approccio.

    OBIETTIVO – C

    Dichiarare una proprietà di UIPopoverPresentationController :

     @property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8; 

    Utilizzare il seguente metodo per presentare il popover da 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]; } 

    Utilizzare il seguente metodo per presentare il popover da 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]; } 

    Implementa questo metodo delegato anche nel tuo controller di visualizzazione:

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

    Per eliminare questo popover, basta chiudere il controller della vista. Di seguito è riportato il codice per chiudere il controller della vista:

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

    SWIFT

    Utilizzare il seguente metodo per presentare il popover da 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) } 

    Utilizzare il seguente metodo per presentare il popover da 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) } 

    Implementa questo metodo delegato anche nel tuo controller di visualizzazione:

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

    Assicurati di aggiungere delegato UIPopoverPresentationControllerDelegate nel file .h / .m / .swift

    PROBLEMA: il popover di iPhone viene visualizzato a schermo intero e non rispetta il valore preferredContentSize.

    SOLUZIONE: Contrariamente a quanto suggerito da Apple nel riferimento alla class UIPopoverPresentationController, presentando il controller della vista dopo aver ottenuto un riferimento al controller della presentazione popover e configurandolo.

     // Get the popover presentation controller and configure it. //... // Present the view controller using the popover style. [self presentViewController:myPopoverViewController animated: YES completion: nil]; 

    Ho trovato qualche soluzione.

    Su Xcode6.1, usa presentationController.delegate invece di 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; } 

    In WWDC 2014 “Visualizza i progressi del controller in iOS8”, i codici seguenti possono mostrare il popover su 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; } 

    Ma su Xcode 6.1, questi codici mostrano la presentazione FullScreen … (nvc.popoverPresentationController is nil)

    Dubito che potrebbe essere un bug di Apple.

    Assicurati di implementare UIAdaptivePresentationControllerDelegate

    come questo:

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

    Se non vuoi i popover a schermo intero

    In iOS 8.3 e versioni successive, utilizzare la seguente syntax nel protocollo UIPopoverPresentationControllerDelegate per sovrascrivere l’ UIModalPresentationStyle del popup.

     func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { return .none } 

    aggiungi questi due metodi nella tua class WEBVIEW. e aggiungi

     -(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; }