2

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)

}
josealvarado111
  • 565
  • 1
  • 9
  • 24
  • http://stackoverflow.com/a/5278744/1597744 or http://stackoverflow.com/a/4405575/1597744 – Toseef Khilji Dec 07 '15 at 05:51
  • @Virussmca I came across those links with a simple google search, but I couldn't replicate that in Swift. Neither my menuViewController or my popoverMenuViewController has a method presentPopoverFromRect – josealvarado111 Dec 07 '15 at 07:02
  • add a custum view as [appdelegate.window addSubview:yourview] with frame upto that tababr item – MOHAMMAD ISHAQ Dec 07 '15 at 07:27

2 Answers2

5

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)
}
josealvarado111
  • 565
  • 1
  • 9
  • 24
3
//Get the views like this...
 func orderedTabBarItemViews() -> [UIView] {
        let interactionViews = tabBar.subviews.filter({$0.userInteractionEnabled})
        return interactionViews.sort({$0.frame.minX < $1.frame.minX})
    }