josealvarado111
josealvarado111

Reputation: 575

Present a popover from a UITabBarItem in swift

I found a lot of examples showing how to present a popover from a UIBarButtonItem, but I want to know how to present it from a UITabBarItem instead.

Here's what I have so far

let selectedItem = self.menuTabBar.items![3]    

let menuViewController: ActivityPopoverViewController = storyboard.instantiateViewControllerWithIdentifier("MenuViewController") as! ActivityPopoverViewController
presentViewController(menuViewController, animated: true, completion: nil)
menuViewController.modalPresentationStyle = .Popover


if let popoverMenuViewController = menuViewController.popoverPresentationController {
    popoverMenuViewController.permittedArrowDirections = .Any
    popoverMenuViewController.delegate = menuViewController


//  popoverMenuViewController.barButtonItem = ?
}

I tried to convert selectedItem which is a UITabBarItem into a UIBarButtonItem but that didn't work. I'm sure it's a simple process, but I can't seem to find any help on how to do it.

My goal is to have this orange popover indicating unread activity.

enter image description here

Update #1. After doing more research, I discovered this strategy to present the view controller

let tabBarItemWidth = Int(self.menuTabBar.frame.size.width) / (self.menuTabBar.items?.count)!
let x = tabBarItemWidth * 3;
let newRect = CGRect(x: x, y: 0, width: tabBarItemWidth, height: Int(self.menuTabBar.frame.size.height))
print(newRect)

let menuViewController: ActivityPopoverViewController = storyboard.instantiateViewControllerWithIdentifier("ActivityPopoverViewController") as! ActivityPopoverViewController
menuViewController.modalPresentationStyle = .Popover


if let popoverMenuViewController = menuViewController.popoverPresentationController {
    popoverMenuViewController.permittedArrowDirections = .Down
    popoverMenuViewController.delegate = menuViewController
    popoverMenuViewController.sourceRect = newRect
    popoverMenuViewController.sourceView = self.menuTabBar
    presentViewController(menuViewController, animated: true, completion: nil)

}

and now my popover is being displayed, but the bounds from newRect aren't working. The popover takes over the entire screen instead of being restricted to the new bounds. Does anyone know how to force the new dimensions?

Update #2

Working Code

let tabBarItemWidth = Int(self.menuTabBar.frame.size.width) / (self.menuTabBar.items?.count)!
let x = tabBarItemWidth * 3;
let newRect = CGRect(x: x, y: 0, width: tabBarItemWidth, height: Int(self.menuTabBar.frame.size.height))
print(newRect)

let menuViewController: ActivityPopoverViewController = storyboard.instantiateViewControllerWithIdentifier("ActivityPopoverViewController") as! ActivityPopoverViewController
menuViewController.modalPresentationStyle = .Popover
menuViewController.view.frame = newRect
menuViewController.preferredContentSize = CGSizeMake(150, 150)

if let popoverMenuViewController = menuViewController.popoverPresentationController {
    popoverMenuViewController.permittedArrowDirections = .Down
    popoverMenuViewController.delegate = menuViewController
    popoverMenuViewController.sourceRect = newRect
    popoverMenuViewController.sourceView = self.menuTabBar

    presentViewController(menuViewController, animated: true, completion: nil)

}

Upvotes: 2

Views: 2687

Answers (2)

James Harvey
James Harvey

Reputation: 31

//Get the views like this...
 func orderedTabBarItemViews() -> [UIView] {
        let interactionViews = tabBar.subviews.filter({$0.userInteractionEnabled})
        return interactionViews.sort({$0.frame.minX < $1.frame.minX})
    }

Upvotes: 3

josealvarado111
josealvarado111

Reputation: 575

Working Code

let tabBarItemWidth = Int(self.menuTabBar.frame.size.width) / (self.menuTabBar.items?.count)!
let x = tabBarItemWidth * 3;
let newRect = CGRect(x: x, y: 0, width: tabBarItemWidth, height: Int(self.menuTabBar.frame.size.height))

let menuViewController: ActivityPopoverViewController = storyboard.instantiateViewControllerWithIdentifier("ActivityPopoverViewController") as! ActivityPopoverViewController
menuViewController.modalPresentationStyle = .Popover
menuViewController.view.frame = newRect
menuViewController.preferredContentSize = CGSizeMake(150, 150)

if let popoverMenuViewController = menuViewController.popoverPresentationController {
    popoverMenuViewController.permittedArrowDirections = .Down
    popoverMenuViewController.delegate = menuViewController
    popoverMenuViewController.sourceRect = newRect
    popoverMenuViewController.sourceView = self.menuTabBar
    popoverMenuViewController.backgroundColor = UIColor.orangeColor()

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

Upvotes: 5

Related Questions