読者です 読者をやめる 読者になる 読者になる

【swift】uitabbarにポップオーバーするメニューを表示する方法

はじめに

また、ちょっと需要なさそうな内容なのですがやりたかったことは以下のような形です。uitabbarのタブをクリックすると画面遷移するのではなくて、ポップオーバーでメニューを表示するということ
f:id:yoppy0066:20150712163958p:plain

実装方法

ポイントは
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
    }
}

完成画面だけみるとシンプルなんですけど、コードにするとけっこう長くなりますね、、、

以上です