iOS 8 and later
Beginning with iOS 8, you can use UIPopoverPresentationController
for iPhones in addition to iPads.
Setup
- Add a
UIBarButtonItem
to your main View Controller. - Add another View Controller to the storyboard. Change it to the size that you want the popover to be and add any content that you want it to have. For my example I just added a
UILabel
. If you want a whole menu, then just add a table view or list of buttons. - Add a segue from the bar button item to the view controller that you will use as the popover. Rather than
show
, choosePresent as Popover
.
- Select the segue in the storyboard and set the identifier to
popoverSegue
(or whatever string you called it in the code).
- In the Attributes inspector for the popover view controller, check Use Preferred Explicit Size and confirm that it is the size you want it to be.
Code
This is the code for the main view controller that has the bar button item in it.
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "popoverSegue" {
let popoverViewController = segue.destinationViewController
popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
popoverViewController.popoverPresentationController!.delegate = self
}
}
// MARK: - UIPopoverPresentationControllerDelegate method
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
// Force popover style
return UIModalPresentationStyle.None
}
}
Popover at an arbitrary anchor point
If you want to set the popover to appear somewhere besides a bar button item (on a UIButton
for example) then you need to set the sourceView
and sourceRect
. See this answer for details.
Further reading
The above example comes mostly from the first link.