Edited at

【SwiftUI】セーフエリアを超えて、コンテンツを表示する


この記事は何?

iPhoneの画面には、セーフエリアと呼ばれる領域があります。

通常、セーフエリアにコンテンツを表示することはできません。

しかしながら、没入感を重視するアプリケーションなど画面いっぱいにコンテンツを表示したい場合があります。

この投稿では、「画面いっぱいに画像を表示する」方法を忘備録として残しておきます。


環境

macOS10.15 beta7

Xcode11 GM


セーフエリア

以下は、画像の表示形式を Fill にして、画面いっぱいに表示するコードです。


画面いっぱいに画像を表示する

struct ContentView: View {

var body: some View {
Image("Catalina")
.resizable()
.aspectRatio(contentMode: .fill)
}
}

実行結果は下図のようになり、画面の上下に白い帯が残ります。

特に、上部はステータスバーの領域と重複しています。

スクリーンショット 2019-09-16 13.18.42.png


Edges Ignoring Safe Area 修飾子

セーフエリアを超えてコンテンツを表示するには、body にあるトップレベルのビューに edgesIgnoringSageArea 修飾子を指定します。

ドキュメントによると

Extends the view out of the safe area on the specified edges.

(指定した縁にあるセーフエリアの外側に、ビューを拡張する)

とあります。


セーフエリアを無視する

struct ContentView: View {

var body: some View {
Image("Catalina")
.resizable()
.aspectRatio(contentMode: .fill)
.edgesIgnoringSafeArea(.all) //すべてのセーフエリアを無視
}
}

上下にあった白い帯がなくなりました。

スクリーンショット 2019-09-16 13.26.10.png

ちなみに、.all の部分は Edge.Set 型となっていて、以下のように定義されていました。


Edge.Setの定義

public static let top: Edge.Set

public static let leading: Edge.Set
public static let bottom: Edge.Set
public static let trailing: Edge.Set
public static let all: Edge.Set
public static let horizontal: Edge.Set
public static let vertical: Edge.Set

leading は画面の左方向で、trailing は画面の右方向です。

leadingtrailing は、既定値として「セーフエリアを超えてコンテンツを表示する」ようになっているようです。


ステータスバー

コンテンツを画面全体に表示できるようになりましたが、ステータスバーが残っていると没入間に欠ける印象があります。

ステータスバーの表示設定については、こちらの投稿で解説しました。

スクリーンショット 2019-09-16 13.36.57.png