環境
・MacOS Ventura 13.0
・Xcode 14.2
・Swift version 5.7.2
・MacOS Ventura 13.0
・Xcode 14.2
・Swift version 5.7.2
プロジェクトを作成するとContView.swiftファイルが作成されるので開いてみます。
コードとレイアウトが並んで表示されます。
Hello worldと書かれている部分を変更してみると右側のレイアウトが即座に変更されているのがわかります。
ビルドしてレイアウトを確認する作業は繰り返すと意外と時間の掛かる作業なのでレイアウトの作成についてはかなり開発の効率は上がりそうです。
Text("Hello world!")
SwiftUIのLabelは文字列とシステムアイコンや画像の名前を以下のように追加して表示します。
システムアイコンを追加する場所は以下のようにに追加します。
Label("文字列", systemImage: "システム画像")
スクリーンショットでは画像→文字列の順番で表示されていますが、表示する場所に応じて画像だけになったり、並び順が変わったりするそうです。
ProgressView("読込中", value: 50, total: 100)
ここからはLayoutについて調べてみます。
.background()内で四角形を追加してProgressViewに背景色を設定してみました。
RadialGradientでBackgroundにグラデーションを設定してみました。
カラーの配列、センターの位置、半径の設定をします。
VStackは縦並びのレイアウト方法です。
VStack内にTextを連続して並べてみます。
VStackに対してフォントサイズを指定することで、3つのテキストに対してまとめてフォントの指定ができました。
区切り線の追加はDivider()と書くだけで簡単に設定できました。
HStackは横並びのレイアウトです。
Numberと区切り線のテキストが入ったレイアウトをそのままHStackのレイアウトに変更すると以下のような横並びのレイアウトになりました。
ZStackは垂直方向のレイアウトになります。
コードで言うと一番最初に配置したものが一番奥に描画されてその上にUIパーツが積み重なっていくイメージだと思います。
スクリーンショットのレイアウトでは四角形の上にテキストが描画されています。
var body: some View {
ScrollView(.vertical) {
LazyVStack(spacing: 10) {
ForEach(0..<100) { index in
Text("\(index)")
.frame(width: 200, height: 200)
.border(.gray.opacity(0.5), width: 5)
.background(.yellow)
.cornerRadius(6)
}
}
.padding(.leading, 10)
.font(.largeTitle)
}
}
var body: some View {
ScrollView(.horizontal) {
LazyHStack(spacing: 10) {
ForEach(0..<100) { index in
Text("\(index)")
.frame(width: 200, height: 200)
.border(.gray.opacity(0.5), width: 5)
.background(.yellow)
.cornerRadius(6)
}
}
.padding(.leading, 10)
.font(.largeTitle)
}
}
var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 10) {
ForEach(0...100, id: \.self) { index in
Text("\(index)")
.frame(width: width / 3, height: width / 3)
.background(colors[index % colors.count])
.cornerRadius(8)
}
}
}
}
let colors: [Color] = [.gray, .yellow, .red, .blue]
var rows: [GridItem] =
Array(repeating: .init(.flexible(), alignment: .center), count: 3)
var body: some View {
ScrollView(.horizontal) {
LazyHGrid(rows: rows, spacing: 10) {
ForEach(0...100, id: \.self) { index in
Text("\(index)")
.frame(width: 100, height: 100)
.background(colors[index % colors.count])
.cornerRadius(8)
}
}
}
}
SwiftUIはコード量が少なく、レイアウトの変化を見ながらコードが書けるのが思っていたよりも快適でした。
UIKit,Storyboardから実装方法がかなり変わるので抵抗が有る方もいるかも知れませんが、触って見る価値が有ると思います。
まだまだできることが有ります。長くなってしまったので残りの部分はPart2で紹介していきたいと思います。