iPhone XのHome Indicatorの表示/非表示を制御する

Home Indicatorとは

iPhone Xでアプリを起動すると画面下部に表示されるIndicatorです。
iPhone Xではこの部分を上にスワイプするとホーム画面に戻ることができます。

whati_is_home_indicator

検証環境

本エントリは以下の環境で検証を行っています。

  • macOS Sierra バージョン 10.12.6
  • Xcode Version 9.1 (9B55)
  • Swift 4
  • iPhone X シミュレーター iOS 11.1

Home Indicatorを消したい

デフォルトではこのIndicatorは常に表示されていますが、アプリや画面によっては消したい場合もあるかと思います。(ゲームとか)

UIViewControllerにHome Indicatorの表示/非表示に関連するメソッドが定義されているのでこれらを使用します。

extension UIViewController {


    // Override to return a child view controller or nil. If non-nil, that view controller's home indicator auto-hiding will be used. If nil, self is used. Whenever the return value changes, -setNeedsHomeIndicatorAutoHiddenUpdate should be called.
    @available(iOS 11.0, *)
    open func childViewControllerForHomeIndicatorAutoHidden() -> UIViewController?


    // Controls the application's preferred home indicator auto-hiding when this view controller is shown.
    @available(iOS 11.0, *)
    open func prefersHomeIndicatorAutoHidden() -> Bool


    // This should be called whenever the return values for the view controller's home indicator auto-hiding have changed.
    @available(iOS 11.0, *)
    open func setNeedsUpdateOfHomeIndicatorAutoHidden()
}

prefersHomeIndicatorAutoHidden()

ViewControllerがOverrideしてtrueを返せばIndicatorは消え、falseを返せばIndicatorは表示されます。 デフォルトはfalseです。

setNeedsUpdateOfHomeIndicatorAutoHidden()

Home Indicatorの表示/非表示の設定を更新したことをUIKitに通知するためのメソッドです。
このメソッドを呼ぶことでprefersHomeIndicatorAutoHiddenが呼ばれて表示/非表示が更新されます。

childViewControllerForHomeIndicatorAutoHidden()

UINavigationControllerのようなコンテナビューコントローラーを使う場合に、子ビューコントローラーがHome Indicatorの表示/非表示を制御する必要がある場合はこのメソッドをオーバーライドして該当の子ビューコントローラーを返します。デフォルトの実装ではnilを返すようになっていて、その場合は自分自身(コンテナビューコントローラー)のprefersHomeIndicatorAutoHiddenが呼ばれます。

やってみた

早速試してみます。以下のようにシンプルに1つ画面を用意し、UISwitchによってIndicatorを消したり表示したりしてみます。

hide_home_indicator_screen

実装

実装は以下のように非常にシンプルです。
prefersHomeIndicatorAutoHidden()をoverrideし、UISwitchのON/OFF状態によってIndicatorの表示/非表示を切り替えています。
ポイントはsetNeedsUpdateOfHomeIndicatorAutoHidden()を呼んでいるところです。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var hideHomeIndicatorSwitch: UISwitch!

    @IBAction func hideHomeIndicatorSwitchValueChanged(_ sender: Any) {
        setNeedsUpdateOfHomeIndicatorAutoHidden()
    }

    // MARK: - Override Methods

    override func prefersHomeIndicatorAutoHidden() -> Bool {
        return hideHomeIndicatorSwitch.isOn
    }
}

実行結果

以下のようにUISwitchのON/OFF状態によってIndicatorの表示/非表示が切り替わりました。
消える時はアニメーションでゆっくり消えますが表示されるのは一瞬ですね。

hide_home_indicator_sample

おわりに

今回はHome Indicatorの表示/非表示を制御する方法をご紹介しました。
もしHome Indicatorを消したい時が出てきたら本エントリを思い出していただければと思います。

参考