【SwiftUI】Viewの重ね合わせ(overlay)

Viewの重ね合わせに使うovarlayモディファイアについて解説します。
本モディファイアはiOS15.0以降で呼び出し方が変わりました。iOS14以前の使い方は、(アーカイブ)【SwiftUI】Viewの背景設定と重ね合わせを参照してください。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】13.3
【Swift】5.6
【iOS】15.4
【macOS】Monterey バージョン 12.3
スポンサーリンク

overlayモディファイアの概要

overlayモディファイアは用途によって、次の3つの使い方があります。
以降の章で各々の使い方を解説します。

  1. Viewの上に別のViewを重ねる
  2. Viewの上に塗りつぶし図形を重ねる
  3. Viewの上にスタイルを重ねる

尚、本モディファイアは複数重ねが可能です。

スポンサーリンク

Viewの上に別のViewを重ねる

Viewの上に別のViewを重ねる際に使うイニシャライザです。
過去のバージョンで使用していたイニシャライザ.overlay(View, alignment:)は、iOS15以降こちらに置き換わりました。

【引数】
alignment(省略可)
元Viewに対する重ね合わせViewの配置位置をAlignmentで指定します。
省略した場合は.centerが適用されます。

content
重ね合わせるViewを記述します。

使用例

UntitledImage

スポンサーリンク

Viewの上に塗りつぶし図形を重ねる

Viewの上に塗りつぶし図形を重ねる際に使うモディファイアです。

【引数】
style
重ね合わせる図形を塗りつぶすViewを指定します。
指定できるのはColorやグラデーション、Image等、ShapeStyleプロトコルに準拠したViewのみです。

in
重ね合わせる図形の形状を、組み込み図形カスタムShapeなどのShapeプロトコルに準拠したViewで指定します。

fillStyle(省略可)
塗りつぶしのレンダリングスタイルをFillStyle構造体で指定します。省略した場合は引数無しの"FillStyle()"が指定されます。

使用例

fillStyleオプションを使わない場合は、前途のイニシャライザ「Viewの上に別のViewを重ねる」を使ったほうが使い勝手が良いように思います。

UntitledImage

スポンサーリンク

Viewの上にスタイルを重ねる

Viewの上にShapeStyle(Colorやグラデーション、Image等の塗りつぶしView)を配置するモディファイアです。
ShapeStyleを重ね合わせるのは、前途のイニシャライザでもできますが、こちらはセーフエリア外への拡張可否を制御できるのがポイントです。
コンテンツはセーフエリア内に収めつつカバーシートを画面全体に適用、等の制御ができます。

第一引数にShapeStyleプロトコルに準拠していないViewを指定すると、別のイニシャライザ.overlay(:alignment) (※現在では非推奨)が適用され動きが変わりますので注意してください。

【引数】
style
重ね合わせるViewを指定します。
指定できるのはColorやグラデーション、Image等、ShapeStyleプロトコルに準拠したViewのみです。

ignoresSafeAreaEdged(省略可)
セーフエリアを拡張するエッジをEdge.Setで指定します。
引数無しの場合、.all(全方向に拡張) と同じになります。
複数の方向をコレクション形式で[.top, .trailing]のように指定可能です。
拡張無しにするには空のコレクション"[]"を指定します。

使用例

UntitledImage

スポンサーリンク

あわせて読みたい記事

【SwiftUI】Viewの背景指定(background)
Viewの背景を指定、またはViewの背後に別のViewを配置するbackgroundモディファイアについて解説します。 本モディファイアはiOS15.0以降で呼び出し方が変わりました。iOS14以前の使い方は、を参照してください。
【SwiftUI】Viewの配置指定(Alignment)
Viewの配置や整列の指定に使うプロパティについて解説します。
【SwiftUI】Viewをセーフエリア外に拡張する(ignoresSafeArea)
(2022/03/27 更新) Viewをセーフエリア外に拡張する .ignoresSafeArea() モディファイアについて解説します。 iOS14から使えるようになったモディファイアで、以前からあった .edgesIgnoringSa...