【swift】uitabbarにポップオーバーするメニューを表示する方法
はじめに
また、ちょっと需要なさそうな内容なのですがやりたかったことは以下のような形です。uitabbarのタブをクリックすると画面遷移するのではなくて、ポップオーバーでメニューを表示するということ

実装方法
ポイントは
1. UITabBarControllerDelegateのshouldSelectViewControllerを実装
2. UIPopoverPresentationControllerDelegateのadaptivePresentationStyleForPresentationControllerを実装
1はタブを選択された時の処理を記述します。ここで真ん中のセルだったらポップオーバーを表示する処理を記述します。
2は実際にポップオーバーを表示する処理
class TabBarController: UITabBarController, UITabBarControllerDelegate, UIPopoverPresentationControllerDelegate {
var firstViewController: UIViewController!
var secondViewController: UIViewController!
var thirdViewController: UIViewController!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
firstViewController = UIViewController()
secondViewController = UIViewController()
thirdViewController = UIViewController()
firstViewController.view.backgroundColor = UIColor.whiteColor()
secondViewController.view.backgroundColor = UIColor.whiteColor()
thirdViewController.view.backgroundColor = UIColor.whiteColor()
var tabbarItem: UITabBarItem = UITabBarItem(title: "タブ1", image: UIImage(named: "bookmark"), tag: 0)
var tabbarItem2: UITabBarItem = UITabBarItem(title: "タブ2", image: UIImage(named: "bar"), tag: 1)
var tabbarItem3: UITabBarItem = UITabBarItem(title: "タブ3", image: UIImage(named: "group"), tag: 2)
firstViewController.tabBarItem = tabbarItem
secondViewController.tabBarItem = tabbarItem2
thirdViewController.tabBarItem = tabbarItem3
var tabs = NSArray(objects: firstViewController!, secondViewController!, thirdViewController!)
self.setViewControllers(tabs as [AnyObject], animated: false)
self.delegate = self
}
func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
// どのタブが選択されたかを判定します
if viewController == self.secondViewController {
var widthPopover: CGFloat = self.view.frame.width
var heightPopover: CGFloat = 300
var heightTabbar: CGFloat = 50
// ポップオーバーさせるviewcontrollerを生成します
var popoverViewController: UIViewController = UIViewController()
var label = UILabel(frame: CGRectMake(0, 100, widthPopover, 100))
label.text = "ここにメニューとかをおきます"
label.textAlignment = NSTextAlignment.Center
popoverViewController.view.addSubview(label)
popoverViewController.view.frame = CGRectMake(0, 0, widthPopover, heightPopover)
popoverViewController.modalPresentationStyle = .Popover
popoverViewController.preferredContentSize = popoverViewController.view.frame.size
if let presentationController = popoverViewController.popoverPresentationController {
presentationController.permittedArrowDirections = .Down
presentationController.sourceView = self.view
presentationController.sourceRect = CGRectMake(self.view.frame.width/2 - widthPopover/2, self.view.frame.height - heightTabbar, widthPopover, heightPopover)
presentationController.delegate = self
}
presentViewController(popoverViewController, animated: true, completion: nil)
return false
} else {
return true
}
}
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController)
-> UIModalPresentationStyle {
return .None
}
}完成画面だけみるとシンプルなんですけど、コードにするとけっこう長くなりますね、、、
以上です