UITabbarControllerの中でtabbaritemを5つ作成し、左から3番目の真ん中のtabbaritemの上にsubviewを載せてボタン化して、それを押したらViewControllerをモーダル表示する。
というのを下記の記事を参考に試しているのですが、なかなか上手く行かず、、
小ネタ:UITabBarControllerに「モーダル表示するボタン」を追加する(Swift)
↑の記事のコードをswift3に適用させつつ実装しており、エラーなどは一通り修正したのですが、tabbarの上に載せたsubviewの出現と、指定したViewControllerのモーダル表示ができず、苦戦しています。
原因分かる方いらっしゃればアドバイス貰えるとうれしいです。
よろしくお願いします。
import UIKit class MainTabBarViewController: UITabBarController { let modalButton: UIButton = UIButton() override func viewDidLoad() { super.viewDidLoad() // PostViewをModal表示させる let image = UIImage(named: "modalButton") self.modalButton.setBackgroundImage(image, for: .normal) self.modalButton.addTarget(self, action: "openModal", for: UIControlEvents.touchUpInside) self.tabBar.addSubview(self.modalButton) var viewControllerArray = [UIViewController]() //1つ目のtab let currentInfoStoryboard = UIStoryboard(name: "CurrentInfoStoryboard", bundle: nil) guard let currentInfoNavigationViewController = currentInfoStoryboard.instantiateInitialViewController() else { // FIXME: send error report return } viewControllerArray.append(currentInfoNavigationViewController) //2つ目のtab let monthlyTabBarStoryboard = UIStoryboard (name: "MonthlyGraph", bundle: nil ) guard let monthlyGraph = monthlyTabBarStoryboard.instantiateInitialViewController() else { return } viewControllerArray.append(monthlyGraph) //3つ目のtab let postStoryboard = UIStoryboard(name: "PostStoryboard", bundle: nil) guard let postViewController = postStoryboard.instantiateInitialViewController() else { // FIXME: send error report return } viewControllerArray.append(postViewController) //4つ目のtab let appinfostoryboard = UIStoryboard(name: "AppInfo", bundle: nil) guard let appInfoViewController = appinfostoryboard.instantiateInitialViewController() else { return } viewControllerArray.append(appInfoViewController) //5つ目のtab let profileStoryboard = UIStoryboard(name: "ProfileStoryboard", bundle: nil) guard let profileViewController = profileStoryboard.instantiateInitialViewController() else { // FIXME: send error report return } viewControllerArray.append(profileViewController) self.viewControllers = viewControllerArray } //subviewのレイアウト指定 override func viewDidLayoutSubviews() { let v = self.tabBarButtons()?[2] if let v = v { self.modalButton.frame = v.frame } //モーダル表示の関数 func openModal() { let vc = (self.storyboard?.instantiateViewController(withIdentifier: "PostStoryboard"))! as UIViewController? if let vc = vc { self.present(vc, animated: true, completion: nil) } } } extension UITabBarController { func tabBarButtons() -> [UIView]? { return self.tabBar.subviews.reduce([], {(ret: [UIView], item:AnyObject) -> [UIView] in if let v = item as? UIView { if v.isKind(of: NSClassFromString("UITabBarButton")!) { return ret + [v] } } return ret }) } }
あなたの回答
tips
プレビュー