Pychef's Diary

I consider myself an engineer, aren't I?

Swiftでステータスバー、ナビゲーションバー、タブバー、それ以外の高さを取得する

  • いきなり余談

iOSオールスターズ勉強会」に参加してきました!


「iOSオールスターズ勉強会」に参加してきました #dotsios - Qiita

すべてのサンプルコードがSwiftで書かれていた点に何より驚きました(『let UIWebView as WKWebView』ではObjC先輩の力を借りる都合上、登場していましたが)。
さすがにこれはマズイと感じまして、プライベートではSwiftに乗り換えることにしました。

  • さて本題

さて、そんな感じで今日はSwift1日目。
今回は下図の青いViewサイズを取得する方法を考えてみました。
f:id:pychef:20150215195554p:plain

すべてのViewControllerにStatusBar, NavigationBar, TabBarが存在すると仮定し、AppDelegateにstatusBarHeight, navBarHeight, tabBarHeight, availableHeightの4つを用意してあげます。

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    var statusBarHeight:CGFloat? 
    var navBarHeight :CGFloat?
    var tabBarHeight :CGFloat?
    var availableViewHeight :CGFloat? //self.view.frame.size.heightからstatusBarHeight,navbarHeight, tabbarHeightを引いたもの


次に一番最初に呼び出されるrootViewControllerで以下のようなメソッドを用意し、viewDidLoad()時に呼び出してあげます。

func calculateHeights() {
        var ap:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        ap.statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height
        ap.navBarHeight = self.navigationController!.navigationBar.frame.size.height
        ap.tabBarHeight = self.tabBarController!.tabBar.frame.size.height
        ap.availableViewHeight = self.view.frame.size.height-ap.statusBarHeight!-ap.navBarHeight!-ap.tabBarHeight!
    }

これにより一度RootViewControllerでサイズをセットしてあげてるので、他のViewControllerでも下記のように活用できます。

var mainView = UIView()
var ap:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
mainView.frame = CGRectMake(0, ap.statusBarHeight!+ap.navBarHeight!, self.view.frame.size.width, ap.availableViewHeight!)
mainView.backgroundColor = UIColor.blueColor();
self.view.addSubview(mainView)

以上

追記

Xcode 6.3 betaにしたところ上の書き方ではエラーがでました。
下の書き方で対応あれ。

var ap:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate