post Image
iPhoneXのレイアウトで気をつけた3つのこと

雑です。具体的な対応とかはもっといいやり方があったら教えたいただけると助かります :bow_tone1:

目次

  • 最初に
  • LaunchImageにiPhoneX用の画像が追加された
  • StatusBarの高さが変わった
  • 画面下部にSafeAreaInsetが追加された
  • おまけ

※上記以外にもいろいろありますが、僕は上記さえわかればひとまず大丈夫でした。

最初に

Storyboard上のBottomLayoutGuideとTopLayoutGuideはUIView.safeAreaLayoutGuideだからdeprecatedじゃないらしい(あってる?)
https://forums.developer.apple.com/thread/79400

正直、Storyboard上のTopLayoutGuide、BottomLayoutGuideとSuperView.top,SuperView.bottomを使えるようになればiPhoneX対応は楽です。めっちゃいい記事がQiitaにあったのですが、探せないので見つけたら貼ります…

LaunchImageにiPhoneX用の画像が追加された

スクリーンショット 2017-10-23 19.54.05.png

iPhoneX用の画像を設定すると、全画面表示になるので、iPhoneXに対応したっぽくなります。
iPhoneX用のLaunchImageを用意しないと上下に黒い余白ができ、今までの端末と同じエリアしか使われないです。
ただ、StoryboardでLaunchScreenを設定している場合は気にしなくて大丈夫だと思います(自動的にAutoLayoutが良い感じにしてくれます)

StatusBarの高さが変わった

before after
スクリーンショット 2017-10-23 20.56.58.png スクリーンショット 2017-10-23 20.57.22_2.png

今までは基本的に20ptだったStatusBarが〇〇ptになりました。
そのため、固定で20ptを使っていた場合や、NavigationBarと合わせて64ptを固定値として使っていた場合には表示が崩れます。(NavigationBarの高さは44ptで変わっていないようです)
コードの場合は固定値ではなく、下記のPropertyを参照するように修正します。

UIApplication.shared.statusBarFrame.height

Storyboard(IB)の場合は下記のように、StatusBarの高さの調整はコード上で行ったらいいと思います。
ただし、今までStatusbar+NavigationBarの高さ分の64ptで高さを指定していた場合は、StatusBar分の高さを引いて、44ptに指定し直さないといけません。(Storyboard上の見た目は崩れますがしょうがないです)

@IBOutlet weak var NavigationBarViewHeightConstraint: NSLayoutConstraint! {
    willSet {
        newValue.constant += UIApplication.shared.statusBarFrame.height
        //      44        +=     20  or 44
    }
}

上記の方法で自作NavigationBarに適用する場合はConstraintを下記のようにして、NavigationBarのHeightConstraintのConstantを変化させることで対応するといいと思います。
NavigationBar上の要素は下からの位置で制約をつけてください。

スクリーンショット 2017-10-23 20.34.33.png

画面下部にSafeAreaInsetが追加された

before after
スクリーンショット 2017-10-23 21.04.29.png スクリーンショット 2017-10-23 20.57.22.png

iOS11から、SafeAreaInsetというものが登場します。SafeAreaの周りの余白です。この部分ではGestureはできないものと思った方がいいです。ただし、この部分を隠したりするのはだめで、あくまで全画面に見えるようにしろとのことです。
iPhoneXの場合はSafeAreaInsets.bottomが34ptあり、既存端末では0ptです。
そのため、下記のようなメソッドを準備すると便利です。

static let safeAreaBottomInset: CGFloat = {
    if #available(iOS 11.0, *) {
        return UIApplication.shared.keyWindow?.rootViewController?.view.safeAreaInsets.bottom ?? 0
    } else {
        return 0
    }
}()

下記、上記のメソッドを使用した具体的な対応方法になります。

例えば画面下部までTableViewの場合

下記のようにtableFooterViewにsafeAreaInsets.bottom分だけの余白Viewを入れることで、最後のセルがSafeAreaInsetにかぶらないようにします。

スクリーンショット 2017-10-23 21.43.03.png

class TableViewRespondIphoneX: UITableView {

    override init(frame: CGRect, style: UITableViewStyle) {
        super.init(frame: frame, style: style)<img width="545" alt="スクリーンショット 2017-10-23 21.51.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/70276/2e7d0ef9-353b-c5fe-f0c2-bf3548479da3.png">


        self.commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.commonInit()
    }

    private func commonInit() {
        // 1回しか呼ばれない&viewDidLoadの後に実行したいのでasyncしてます
        DispatchQueue.main.async {
            self.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: safeAreaBottomInset))
        }
    }
}

画面下部にボタンとか置く場合

スクリーンショット 2017-10-23 22.23.50.png

Storyboard上で、SuperView.Bottomに紐付けるのでなく、BottomLayoutGuide.Topに紐付けるようにします。
そうすると、SafeAreaのBottomからの距離でLayoutできます。

スクリーンショット 2017-10-23 22.27.43.png

おまけ(iPhoneXの判定)

   static let isIphoneX: Bool = {
       // iPhoneXはiOS11からなのでそれ以外の端末は除外します
       guard #available(iOS 11.0, *),
           UIDevice.current.userInterfaceIdiom == .phone else {
               return false
       }
       let nativeSize = UIScreen.main.nativeBounds.size
       let (w, h) = (nativeSize.width, nativeSize.height)
       let (d1, d2): (CGFloat, CGFloat) = (1125.0, 2436.0)

       return (w == d1 && h == d2) || (w == d2 && h == d1)
   }()

参考:iPhone Xをネイティブ解像度から判定する
https://qiita.com/ShingoFukuyama/items/273ae989442f3d1d11b2


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。