文系プログラマの勉強ノート

スマホアプリ開発やデザインなどについて勉強したことをまとめています

【Xcode】UIAlertControllerの外側をタップで閉じる & Toast風に一定時間後に閉じる方法

UIAlertControllerの外側をタップで閉じる

f:id:an3714106:20170208205827p:plain

UIAlertControllerで、外側(上の図でグレーの部分)をタップすると閉じる方法です。

class ViewController: UIViewController {
    
    var alert: UIAlertController!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        // 外側をタップで非表示
        alert = UIAlertController(title: "Alert", message: "Tap outside of alert and dismiss", preferredStyle: .alert)
        present(alert, animated: true, completion: {
            self.alert.view.superview?.isUserInteractionEnabled = true
            self.alert.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.closeAlert)))
        })
    }
    
    func closeAlert() {
        alert.dismiss(animated: true, completion: nil)
        alert = nil
    }
}


一定時間後に消えるToast風AlertController

AndroidのToastのように、タップしなくても一定時間後に消える方法です。

class ViewController: UIViewController {
    
    var alert: UIAlertController!

    override func viewDidAppear(_ animated: Bool) {
        
        super.viewDidAppear(animated)
        
        // 一定時間後に非表示
        alert = UIAlertController(title: nil, message: "This alert will disappear after 3 sec", preferredStyle: .alert)
        present(alert, animated: true, completion: {
            self.perform(#selector(self.closeAlert), with: nil, afterDelay: 3.0)
        })
    }
    
    func closeAlert() {
        alert.dismiss(animated: true, completion: nil)
        alert = nil
    }

Toast風の方はExtension化しておけば使い手がありそう。