How to present popover properly in iOS 8 How to present popover properly in iOS 8 swift swift

How to present popover properly in iOS 8


Okay, A housemate took a look at it and figured it out:

 func addCategory() {    var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController    var nav = UINavigationController(rootViewController: popoverContent)    nav.modalPresentationStyle = UIModalPresentationStyle.Popover    var popover = nav.popoverPresentationController    popoverContent.preferredContentSize = CGSizeMake(500,600)    popover.delegate = self    popover.sourceView = self.view    popover.sourceRect = CGRectMake(100,100,0,0)    self.presentViewController(nav, animated: true, completion: nil)}

That's the way.

You don't talk to the popover itself anymore, you talk to the view controller inside of it to set the content size, by calling the property preferredContentSize


Actually it is much simpler than that. In the storyboard you should make the viewcontroller you want to use as popover and make a viewcontroller class for it as usual. Make a segue as shown below from the object you want to open the popover, in this case the UIBarButton named "Config".

enter image description here

In the "mother viewcontroller" implement the UIPopoverPresentationControllerDelegate and the delegate method:

func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {    //do som stuff from the popover}

Override the prepareForSeque method like this:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {     //segue for the popover configuration window    if segue.identifier == "yourSegueIdentifierForPopOver" {        if let controller = segue.destinationViewController as? UIViewController {            controller.popoverPresentationController!.delegate = self            controller.preferredContentSize = CGSize(width: 320, height: 186)        }    }}

And you're done. And you can now treat the popover view as any other view, ie. add fields and what not! And you get hold of the the content controller by using the popoverPresentationController.presentedViewController method in the UIPopoverPresentationController.

Also on an iPhone you would have to overwrite

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


I found a complete example of how to get this all to work so that you can always display a popover no matter the device/orientation https://github.com/frogcjn/AdaptivePopover_iOS8_Swift.

The key is to implement UIAdaptivePresentationControllerDelegate

func adaptivePresentationStyleForPresentationController(PC: UIPresentationController!) -> UIModalPresentationStyle {    // This *forces* a popover to be displayed on the iPhone    return .None}

Then extend the example above (from Imagine Digital):

nav.popoverPresentationController!.delegate = implOfUIAPCDelegate