List
今回はSwiftUIのListを使ってアプリを作ります。
はじめに
今回はSwiftUIのListを使って最終的にはこのような画面を作ります。
簡単なリスト
リストは例えば設定アプリの部分などに使われています。
ということで、まずは簡単なリストを作ってみましょう。
List {
Text("New York")
Text("London")
Text("Tokyo")
}
Textでこのように表示されます。
定数を使って表示
前回の記事で出てきた定数を使って表示してみましょう。
次の定数を定義してください。
let fruits = ["apple","orange","banana","mango","melon","water melon","strawberry","blueberry","kiwi","lemon"]
次に、さっきの
List {
Text("New York")
Text("London")
Text("Tokyo")
}
これを下のコードに置き換えてください。
List(fruits, id: \.self) { fruit in
Text(fruit)
}
List(fruits, id: \.self) { fruit in
この行で、List() 関数を使用して、fruits配列をリストとして表示します。
id: パラメータで、リストの要素を識別するためのキーを指定します。この場合、要素を識別するために、要素自体をキーとして指定しています。
Section
ListのSectionを紹介します。
まずはコードと画面をご覧ください。
List {
Section("fruits") {
Text("apple")
Text("orange")
Text("banana")
}
Section("languages") {
Text("Swift")
Text("Python")
Text("Javascript")
}
}
Sectionでリストのグループ化ができます。
グループのタイトルは Section(ここに書きましたが)
headerを使っても同じようにできます。
List {
Section {
Text("apple")
Text("orange")
Text("banana")
} header: {
Text("fruits")
}
Section {
Text("Swift")
Text("Python")
Text("Javascript")
} header: {
Text("languages")
}
}
ここまでで気付いたかもしれませんが、Sectionのタイトルが大文字になっています。
そこで.textCase(nil)モディファイアを使うことで、小文字でも表示できるようにできます。
List {
Section("fruits") {
Text("apple")
Text("orange")
Text("banana")
}
.textCase(nil)
Section {
Text("Swift")
Text("Python")
Text("Javascript")
} header: {
Text("languages")
}
.textCase(nil)
}
NavigationStack
次に、NavigationStackを使います。
とりあえずコードと画面を見てください。
struct ContentView: View {
let fruits = ["apple","orange","banana","mango","melon","water melon","strawberry","blueberry","kiwi","lemon"]
var body: some View {
NavigationStack {
List(fruits, id:\.self) { fruit in
Text(fruit)
}
.navigationTitle("Fruits")
}
}
}
NavigationStackはNavigationLinkというのを使って、別の画面に遷移させるのが普通の使い方ですが、ビューにタイトルがあるとわかりやすいので使います。
そこで1つ注意なのが
.navigationTitle()の場所です。
navigationTitleはNavigationStackの中に記述します。
ということで練習問題として世界時計の画面を作ってもらいます。
練習問題
今までの知識を使って画面を完成させましょう。
色やフォントサイズなど載せておきます。
テキスト | .font | .foregroundStyle | .fontWeight |
---|---|---|---|
今日、-9時間 | .subheadline | .gray | ----- |
ロンドン | .title | ----- | ----- |
9:00 | .system(size: 50) | ----- | .light |
.fontWeightは文字の太さを指定できます。
あともう一つ、VStackの中のビューを左寄せにするやり方を紹介します。
VStack(alignment: .leading)
※今回は変数や定数は使わず、時間を取得するコードは書かないでやってください。
🔥🔥🔥🔥🔥
答え
struct ContentView: View {
var body: some View {
NavigationStack {
List {
HStack {
VStack(alignment: .leading) {
Text("今日、-9時間")
.font(.subheadline)
.foregroundStyle(.gray)
Text("ロンドン")
.font(.title)
}
Spacer()
Text("9:00")
.font(.system(size: 50))
.fontWeight(.light)
}
HStack {
VStack(alignment: .leading) {
Text("今日、+0時間")
.font(.subheadline)
.foregroundStyle(.gray)
Text("東京")
.font(.title)
}
Spacer()
Text("18:00")
.font(.system(size: 50))
.fontWeight(.light)
}
HStack {
VStack(alignment: .leading) {
Text("今日、-15時間")
.font(.subheadline)
.foregroundStyle(.gray)
Text("シカゴ")
.font(.title)
}
Spacer()
Text("3:00")
.font(.system(size: 50))
.fontWeight(.light)
}
HStack {
VStack(alignment: .leading) {
Text("今日、-14時間")
.font(.subheadline)
.foregroundStyle(.gray)
Text("ニューヨーク")
.font(.title)
}
Spacer()
Text("4:00")
.font(.system(size: 50))
.fontWeight(.light)
}
HStack {
VStack(alignment: .leading) {
Text("今日、-7時間")
.font(.subheadline)
.foregroundStyle(.gray)
Text("ケープタウン")
.font(.title)
}
Spacer()
Text("11:00")
.font(.system(size: 50))
.fontWeight(.light)
}
}
.navigationTitle("世界時計")
}
}
}
解説
まず、NavigationStackと.navigationTitleを使って「世界時計」というタイトルのビューを作成します。
次にHStackの構造を見ていきましょう。
HStack {
VStack(alignment: .leading) {
Text("今日、-9時間")
.font(.subheadline)
.foregroundStyle(.gray)
Text("ロンドン")
.font(.title)
}
Spacer()
Text("9:00")
.font(.system(size: 50))
.fontWeight(.light)
}
HStackで「今日、-9時間 & ロンドン」と「9:00」を分けています。
「今日、-9時間」と「ロンドン」はVStackで囲っていますが、「alignment: .leading」で左寄せにしています。