how to use popover controller in iPhone
Asked Answered
C

1

13

I couldn't show popover controller as popover in iPhone whereas it works very well with iPad.

Any ideas on how to do that in iPhone.

As far as I have searched I couldn't find any.

anyways to make the popover appear in iphone as it is in iPad is appreciated !

Chantress answered 19/5, 2018 at 17:9 Comment(3)
Possible duplicate of popover doesn't display on iphoneToiletry
This doesn't solve my problemChantress
"Generally, popovers should be reserved for use in iPad apps. In iPhone apps, utilize all available screen space by presenting information in a full-screen modal view, rather than in a popover. For related guidance, see Modality."Marine
G
45

Set yourself as the popover view controller's delegate before presenting it, and implement the delegate method adaptivePresentationStyle(for:traitCollection:) to return .none. This will cause the popover to stop adapting on iPhone as a fullscreen presented view controller and turn into an actual popover just like on the iPad.

This is a complete working example that presents the popover in response to a button tap:

class ViewController: UIViewController {
    @IBAction func doButton(_ sender: Any) {
        let vc = MyPopoverViewController()
        vc.preferredContentSize = CGSize(400,500)
        vc.modalPresentationStyle = .popover
        if let pres = vc.presentationController {
            pres.delegate = self
        }
        self.present(vc, animated: true)
        if let pop = vc.popoverPresentationController {
            pop.sourceView = (sender as! UIView)
            pop.sourceRect = (sender as! UIView).bounds
        }
    }
}
extension ViewController : UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .none
    }
}
Gynandry answered 19/5, 2018 at 18:6 Comment(4)
For code supporting both iPhone and iPad may I suggest: func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { return UIDevice.current.userInterfaceIdiom == .pad ? .popover : .none }Larhondalari
@DavidH You don't understand the code. If we're on an iPad plain and simple, this method won't even be called, and the popover will be a popover.Gynandry
@DavidH But what happened when you tried my code on the iPad?Gynandry
Matt, so of course it worked as expected on iPhone. But that delegate method is called on iPad - I tested it just now, however it still works as before on iPad.Larhondalari

© 2022 - 2024 — McMap. All rights reserved.