Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to present PopOver in iOS9

Tags:

ios

swift

I am trying to create a pop over and when I present the view controller, the background is always solid black and the size is full screen.

I can't seem to figure out what's wrong and here is the code that I have

  @IBAction func distancePopOver( sender : UIBarButtonItem){

    //a UIViewController that I created in the storyboard
    let controller = storyboard!.instantiateViewControllerWithIdentifier("distancePopOver")
    controller.modalPresentationStyle= UIModalPresentationSTyle.PopOver
    controller.preferredContentSize = CGSizeMake(200,30)
    self.presentViewController(controller, animated: true, completion: nil)

    //Configure the Popover presentation controller
    let popController = (controller.popoverPresentationController)!
    popController.permittedArrowDirections = UIPopoverArrowDirection.Down
    popController.barButtonItem = sender
    popController.delegate = self
  }

Whenever I click on the UIBarButtonItem, it presents the view in full screen, but shouldn't it be the size I specify in line 5?

like image 309
GalaxyVintage Avatar asked Dec 01 '15 20:12

GalaxyVintage


1 Answers

Popovers are quite finicky now. First, you are going to want to configure the popoverPresentationController before you present it.

Secondly, make sure your arrow direction is pointing the way the arrow points and not where the content is respective to the UIBarButtonItem. So, if its inside UIToolbar (and is near the bottom of the screen) you'll want .Down otherwise if its a navigation bar (near the top) you'll want to use .Up.

@IBAction func distancePopOver( sender : UIBarButtonItem){

    //Configure the Popover presentation controller
    let popController = (controller.popoverPresentationController)!
    popController.permittedArrowDirections = .Down // .Up
    popController.barButtonItem = sender
    popController.delegate = self

    //a UIViewController that I created in the storyboard
    let controller = storyboard!.instantiateViewControllerWithIdentifier("distancePopOver")
    controller.modalPresentationStyle = .Popover
    controller.preferredContentSize = CGSizeMake(200,30)

    presentViewController(controller, animated: true, completion: nil)
}

Now if you got this far and its still not working, its because the popover's default behavior in a compact size class is to fill the screen. Since you are already setting your view controller to be the popover's delegate you'll just need to implement this delegate function: adaptivePresentationStyleForPresentationController(_:traitCollection:) and return .None for the presentation style. This will allow you to even show a real looking popover on the iPhone. See my blog post: iPhone Popover for a full example of doing this.

like image 160
Korey Hinton Avatar answered Nov 02 '22 04:11

Korey Hinton