Reputation: 575
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.
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
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
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