【问题标题】:Present a popover from a UITabBarItem in swift快速呈现来自 UITabBarItem 的弹出框
【发布时间】:2015-12-07 04:22:53
【问题描述】:

我发现了很多示例展示如何从 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 = ?
}

我尝试将 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)

}

现在我的弹出框正在显示,但 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)

}

【问题讨论】:

  • @Virussmca 我通过简单的谷歌搜索发现了这些链接,但我无法在 Swift 中复制这些链接。我的 menuViewController 或 popoverMenuViewController 都没有方法 presentPopoverFromRect
  • 将自定义视图添加为 [appdelegate.window addSubview:yourview] 并在该 tababr 项目上添加框架

标签: swift popover uitabbaritem


【解决方案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))

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)
}

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 2019-02-26
      • 2020-12-20
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2014-10-16
      • 1970-01-01
      • 2013-06-06
      相关资源
      最近更新 更多