问题
I am trying to use UIPopoverPresentationController
to display a popover
that doesn't take up the whole screen. I've followed many different tutorials with no luck.
Here is my code. It correctly instantiates the ViewController
, but it takes up the entire screen instead of just a smaller screen as I defined in preferredContentSize
.
func showPopover() {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("PopupTimePickerViewController") as PopupTimePickerViewController
vc.modalPresentationStyle = .Popover
vc.preferredContentSize = CGSizeMake(200, 100)
if let presentationController = vc.popoverPresentationController {
presentationController.delegate = self
presentationController.permittedArrowDirections = .Up
presentationController.sourceView = self.view
presentationController.sourceRect = CGRectMake(0, 0, 50, 50)
self.presentViewController(vc, animated: true, completion: nil)
}
}
Update 9/27/16 with correct answer
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
回答1:
In iPhone, you should add the following in order to present a popover.
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle {
// Return no adaptive presentation style, use default presentation behaviour
return .None
}
回答2:
For Swift3/IOS10, looks like we need to do some thing like
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
{
return .none
}
Adding this answer, in case, someone runs into this problem as i did when migrating to swift3/IOS10
回答3:
For Swift3+/IOS10+, when dealing with iPhone:
You must add UIPopoverPresentationControllerDelegate the delegate at:
class YourClass: UIViewController, UIPopoverPresentationControllerDelegate { ...
Then implement in this same parent class (which will show the popover) the method below.
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
{
return .none
}
And then set the popover configuration below:
myPopover.modalPresentationStyle = .popover
myPopover.popoverPresentationController?.sourceRect = VIEWTOPOINTTHEARROW.frame
myPopover.popoverPresentationController?.sourceView = self.view
myPopover.popoverPresentationController?.delegate = self
Also you may set some configuration for the popover class
class MyPopover: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//popover size
self.preferredContentSize = CGSize(width: 320, height: 200)
//sets the arrow of the popover to same color of background
self.popoverPresentationController?.backgroundColor = self.view.backgroundColor
}
}
回答4:
The accepted answer is correct. For completeness, see Adapting Presented View Controllers to a New Style in the Apple docs:
Use the delegate’s
adaptivePresentationStyleForPresentationController:
method to specify a different presentation style than the default. When transitioning to a compact environment, the only supported styles are the two full-screen styles orUIModalPresentationNone
. ReturningUIModalPresentationNone
tells the presentation controller to ignore the compact environment and continue using the previous presentation style. In the case of a popover, ignoring the change gives you the same iPad-like popover behavior on all devices.
Make sure that the required configurations from Presenting a View Controller in a Popover are met:
After setting the modal presentation style [of the presented view controller] to
UIModalPresentationPopover
, configure the following popover-related attributes:
- Set the
preferredContentSize
property of your view controller to the desired size.- Set the popover anchor point using the associated
UIPopoverPresentationController
object, which is accessible from the view controller’spopoverPresentationController
property.- Set only one of the following:
- Set the
barButtonItem
property to a bar button item.- Set the
sourceView
andsourceRect
properties to a specific region in one of your views.
回答5:
iOS 12 / Swift 4
There's also the possibility to show the popover on IPhone's as fullscreen and on IPad's as a popover.
Just return .popover
for adaptivePresentationStyle()
:
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .popover
}
and set the popover-configuration like @mourodrigo did:
dialog.modalPresentationStyle = .popover
dialog.popoverPresentationController?.delegate = self
dialog.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
dialog.popoverPresentationController?.sourceView = view
dialog.popoverPresentationController?.sourceRect = view.frame
来源:https://stackoverflow.com/questions/27353691/uipopoverpresentationcontroller-displaying-popover-as-full-screen