Search code examples
objective-ciphoneuipopovercontrollerios8uipopover

UIPopoverPresentationController on iOS 8 iPhone


Does anyone know if UIPopoverPresentationController can be used to present popovers on iPhones? Wondering if Apple added this feature on iOS 8 in their attempt to create a more unified presentation controllers for iPad and iPhone.

Not sure if its OK to ask/answer questions from Beta. I will remove it in that case.


Solution

  • You can override the default adaptive behaviour (UIModalPresentationFullScreen in compact horizontal environment, i.e. iPhone) using the adaptivePresentationStyleForPresentationController: method available through UIPopoverPresentationController.delegate.

    UIPresentationController uses this method to ask the new presentation style to use, which in your case, simply returning UIModalPresentationNone will cause the UIPopoverPresentationController to render as a popover instead of fullscreen.

    Here's an example of the popover using a segue setup in storyboard from a UIBarButtonItem to "present modally" 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
        }
    }
    

    This trick was mentioned in WWDC 2014 session 214 "View Controller Advancement in iOS8" (36:30)