iPhoneXで登場したノッチ部分への対応は今後必須になる。
StoryboardのAutoLayoutを使えばそれほど意識せずに対応可能だが、SpriteKitを使う場合は少々手間がかかった。
今回はその対応手順を記す。
StoryboardのAutoLayoutを使えばそれほど意識せずに対応可能だが、SpriteKitを使う場合は少々手間がかかった。
今回はその対応手順を記す。
UIKitの対応方法
UIKitを使う場合は実はとても簡単だ。
特に意識せずとも勝手に対応される。
例えばStoryboardでこのように画像(UIImageView)を配置する。
見ての通り、しっかりとノッチ対応されている。
なお、Content ModeがAspectFillにしている場合、画像がはみ出すと正しく表示されないのでClip to boundsにチェックを入れておくのを忘れないこと。
この画像を画面いっぱいに表示したい場合はどうすれば良いか。
(背景画像は端っこが切れても良い場合もあるだろう。)
制約のつける先をSafeAreaからSuperviewにしてやれば良い。
ここではTrailingの制約を変更してみよう。
から
に変更する。
Constantの値を0にしておくのも忘れないようにする。
この結果はこうなる。
右上がしっかり端まで表示されている。
同様にTop, Bottom, Leadingも変更するとこのようになる。
期待通りの結果だ。
SpiteKitの対応方法
まずはsksファイルを開き、シーンのサイズを2048x1152とする。
これは16:9なのでiPhone8等ではぴったりと表示される。
ここに背景用の画像(2048x1152)スプライトを追加しておく。
これを実行してみるとこのようになる。
ここからが本番だ。
sksファイル上での対応は出来ないのでコードで対応する。
iPhoneXを判別する
まずはiPhoneXとその他を判別する必要があるだろう。
iOS11からSKViewにsafeAreaInsetsというプロパティが追加されているのでこれを使えば良さそうだ。
まずはsafeAreaInsetsにどのように値が入るか見てみよう。
これで実行してみると値がセットされていないのがわかる。
まだレイアウトが確定していないため値がセットされていないのだ。
参考文献
【iOS11】safeAreaInsetsの値が取得できるタイミング
よって、GameSceneを作成する処理をviewDidLoad()からviewWillLayoutSubviews()に移す。
これで実行するとsafeAreaInsetsに値が入るようになった。
(注) viewWillLayoutSubviews()が何度も実行されるような作りの場合、一度だけ実行するようにフラグ等を使うことを忘れないようにしたい。
top: 0.0, left: 44.0, bottom: 21.0, right: 44.0
となっているのでleftが0よりも大きければiPhoneXと判断すれば良さそうだ。
以下のようにする。
(1) シーンのサイズは2048x1152だが、これをiPhoneXにAspectFillで表示すると上下が少しはみ出してしまう。
そのため、iPhoneXにぴったり表示される領域をこのように計算する。
(2) viewのサイズは812x375ptなので、これとシーンサイズとの比率を計算しておく
(3) (2)で求めた比率を使ってシーン上でのセーフエリアを計算する
これで実行するとこのようになる。
期待通りの結果が得られた。
UIKitを使う場合は実はとても簡単だ。
特に意識せずとも勝手に対応される。
例えばStoryboardでこのように画像(UIImageView)を配置する。
見ての通り、しっかりとノッチ対応されている。
なお、Content ModeがAspectFillにしている場合、画像がはみ出すと正しく表示されないのでClip to boundsにチェックを入れておくのを忘れないこと。
この画像を画面いっぱいに表示したい場合はどうすれば良いか。
(背景画像は端っこが切れても良い場合もあるだろう。)
制約のつける先をSafeAreaからSuperviewにしてやれば良い。
ここではTrailingの制約を変更してみよう。
から
に変更する。
Constantの値を0にしておくのも忘れないようにする。
この結果はこうなる。
右上がしっかり端まで表示されている。
同様にTop, Bottom, Leadingも変更するとこのようになる。
期待通りの結果だ。
SpiteKitの対応方法
まずはsksファイルを開き、シーンのサイズを2048x1152とする。
これは16:9なのでiPhone8等ではぴったりと表示される。
ここに背景用の画像(2048x1152)スプライトを追加しておく。
これを実行してみるとこのようになる。
ここからが本番だ。
sksファイル上での対応は出来ないのでコードで対応する。
iPhoneXを判別する
まずはiPhoneXとその他を判別する必要があるだろう。
iOS11からSKViewにsafeAreaInsetsというプロパティが追加されているのでこれを使えば良さそうだ。
まずはsafeAreaInsetsにどのように値が入るか見てみよう。
これで実行してみると値がセットされていないのがわかる。
まだレイアウトが確定していないため値がセットされていないのだ。
参考文献
【iOS11】safeAreaInsetsの値が取得できるタイミング
よって、GameSceneを作成する処理をviewDidLoad()からviewWillLayoutSubviews()に移す。
これで実行するとsafeAreaInsetsに値が入るようになった。
(注) viewWillLayoutSubviews()が何度も実行されるような作りの場合、一度だけ実行するようにフラグ等を使うことを忘れないようにしたい。
top: 0.0, left: 44.0, bottom: 21.0, right: 44.0
となっているのでleftが0よりも大きければiPhoneXと判断すれば良さそうだ。
以下のようにする。
(1) シーンのサイズは2048x1152だが、これをiPhoneXにAspectFillで表示すると上下が少しはみ出してしまう。
そのため、iPhoneXにぴったり表示される領域をこのように計算する。
(2) viewのサイズは812x375ptなので、これとシーンサイズとの比率を計算しておく
(3) (2)で求めた比率を使ってシーン上でのセーフエリアを計算する
これで実行するとこのようになる。
期待通りの結果が得られた。
コメント