快速显示来自 UITabBarItem 的弹出框

jos*_*111 1 popover uitabbaritem swift

我找到了很多示例,展示了如何从 UIBarButtonItem 呈现弹出框,但我想知道如何从 UITabBarItem 呈现它。

这是我到目前为止所拥有的

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 = ?
}
Run Code Online (Sandbox Code Playgroud)

我试图将作为 UITabBarItem 的 selectedItem 转换为 UIBarButtonItem ,但这没有用。我确定这是一个简单的过程,但我似乎无法找到有关如何执行此操作的任何帮助。

我的目标是让这个橙色弹出框指示未读活动。

在此处输入图片说明

更新#1。在做了更多的研究之后,我发现了这种呈现视图控制器的策略

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)

}
Run Code Online (Sandbox Code Playgroud)

现在正在显示我的弹出框,但是 newRect 的边界不起作用。弹出框接管整个屏幕而不是被限制在新的边界上。有谁知道如何强制新维度?

更新 #2

工作代码

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)

}
Run Code Online (Sandbox Code Playgroud)

jos*_*111 5

工作代码

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)
}
Run Code Online (Sandbox Code Playgroud)