iOS 13で操作できないように画面(View)をロックする

古い方法

iOS 13で画面をロックするための便利なメソッドが非推奨になりました。

// ロック
UIApplication.shared.beginIgnoringInteractionEvents()

// 解除
UIApplication.shared.endIgnoringInteractionEvents()
'beginIgnoringInteractionEvents()' was deprecated in iOS 13.0: Use UIView's userInteractionEnabled property instead

代わりに各viewのuserInteractionEnabledを使いなさいって事なんでしょうけど、下に引っ張って閉じられるモーダル画面の場合にはviewだけではインタラクションを無効にできません。

新しい方法

そういった場合にはoverlayViewを作ってwindow全体を覆ってしまうようにします。移行しやすいように同じ名前のメソッドでUIWindowを拡張しておきます。

extension UIWindow {

    func beginIgnoringInteractionEvents() {
        let overlayView = UIView(frame: bounds)
        overlayView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        overlayView.tag = 10000
        addSubview(overlayView)
    }

    func endIgnoringInteractionEvents() {
        viewWithTag(10000)?.removeFromSuperview()
    }
}
// ロック
UIApplication.shared.delegate?.window??.beginIgnoringInteractionEvents()

// 解除
UIApplication.shared.delegate?.window??.endIgnoringInteractionEvents()