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

Pychef's Diary

I consider myself an engineer, aren't I?

Swift - UIStatusBar + UINavigationBarの上にCustomのUIViewやUILabelを追加する方法

単純にaddSubviewできない問題

カスタムのAlertや通知を表示させたいとき、UIStatusBarやUINavigationBarの上に追加したくなりますよね。 しかし、単純にaddSubviewしてもうまくいかない。 時刻は表示されるし、NavigationBarのbuttonは反応するし、大変…。

解決方法

  1. カスタムのUIWindowを作る
  2. その上にViewControllerを置く
  3. またその上にLabelを置く

イメージ

  • 真ん中の黄色い四角を押すと…カスタムWindowが表示される

  • f:id:pychef:20151027223355p:plain:w150

  • f:id:pychef:20151027223402p:plain:w150

コード

// 通知っぽい動きはUIViewのanimate~メソッドでカスタマイズしてください
// てきとうにadditionalWindowを宣言しておいた上で…


    private func setupCustomAlertWindow(){
        self.additionalWindow = UIWindow()
        self.additionalWindow.frame = CGRectMake(0,0,self.view.bounds.width,66)
        self.additionalWindow.clipsToBounds = true
        self.additionalWindow.windowLevel = UIWindowLevelAlert
        
        let additionalLabel = UILabel()
        additionalLabel.frame = self.additionalWindow.frame
        additionalLabel.backgroundColor = UIColor.clearColor()
        additionalLabel.text = "some kinda alert"
        additionalLabel.textColor = UIColor.grayColor()
        additionalLabel.textAlignment = NSTextAlignment.Center
        additionalLabel.userInteractionEnabled = true
        
        //tap検知したければ以下の2行追加
        let tapGesture = UITapGestureRecognizer(target: self, action:"didTapCustomAlert:")
        additionalLabel.addGestureRecognizer(tapGesture)
        
        // ViewControllerにより、画面のローテーションを検知できる iOS8以上
        let additionalViewController = UIViewController()
        additionalViewController.view.backgroundColor = UIColor.blueColor()
        additionalViewController.view.frame = self.additionalWindow.bounds
        additionalViewController.view.addSubview(additionalLabel)
        
        self.additionalWindow.rootViewController = additionalViewController
        self.additionalWindow.makeKeyAndVisible()
    }

カスタムのUIWindowを消したいときはnilを入れると消えます。 removeFromSuperview的なメソッドは今のところない模様。

self.additionalWindow = nil