Develop Apps for iOSをやってみる 〜その2〜
はじめに
DX推進室の野上です。
前回 の続きです
どこから?
今回はここから続けます。
CardViewを作る
DailyScrum Modelを作る
CardViewで表示するデータのモデルを作成します。
以下の4つのプロパティを持ちます。
- title
- attendees
- lengthInMinutes
- color
XCodeの左ペインから新しいGroupのModelsを作ってその配下に新しいファイルを追加しましょう。
新しいファイルはSwiftUIを選択してください。
ファイル名はDailyScrum.swiftです。
出来上がったファイルに以下の内容を記述します。
import SwiftUI
struct DailyScrum {
var title: String
var attendees: [String]
var lengthInMinutes: Int
var color: Color
}
さらにその下にテスト用のデータを追記します。
extension DailyScrum {
static var data: [DailyScrum] {
[
DailyScrum(title: "Design", attendees: ["Cathy", "Daisy", "Simon", "Jonathan"], lengthInMinutes: 10, color: Color("Design")),
DailyScrum(title: "App Dev", attendees: ["Katie", "Gray", "Euna", "Luis", "Darla"], lengthInMinutes: 5, color: Color("App Dev")),
DailyScrum(title: "Web Dev", attendees: ["Chella", "Chris", "Christina", "Eden", "Karla", "Lindsey", "Aga", "Chad", "Jenn", "Sarah"], lengthInMinutes: 1, color: Color("Web Dev"))
]
}
}
Card Viewを作る
CardView.swiftを新しいファイルとして作成して以下の内容を記述します。
import SwiftUI
struct CardView: View {
var body: some View {
Text("Hello, World!")
}
}
struct CardView_Previews: PreviewProvider {
static var previews: some View {
CardView()
}
}
DailyScrumで作ったテスト用のデータをプレビューでは表示するようにして、CardViewに初期値として渡します。
import SwiftUI
struct CardView: View {
let scrum: DailyScrum
var body: some View {
Text("Hello, World!")
}
}
struct CardView_Previews: PreviewProvider {
static var scrum = DailyScrum.data[0]
static var previews: some View {
CardView(scrum: scrum)
}
}
プレビューの背景色とサイズを修正します。
import SwiftUI
struct CardView: View {
let scrum: DailyScrum
var body: some View {
Text("Hello, World!")
}
}
struct CardView_Previews: PreviewProvider {
static var scrum = DailyScrum.data[0]
static var previews: some View {
CardView(scrum: scrum)
.background(scrum.color)
.previewLayout(.fixed(width: 400, height: 60))
}
}
CardView側で表示するTextをテストデータのscrum.titleにします。
import SwiftUI
struct CardView: View {
let scrum: DailyScrum
var body: some View {
Text(scrum.title)
.font(.headline)
}
}
struct CardView_Previews: PreviewProvider {
static var scrum = DailyScrum.data[0]
static var previews: some View {
CardView(scrum: scrum)
.background(scrum.color)
.previewLayout(.fixed(width: 400, height: 60))
}
}
TextをVStackに入れてアライメントを指定します。
import SwiftUI
struct CardView: View {
let scrum: DailyScrum
var body: some View {
VStack(alignment: .leading) {
Text(scrum.title)
.font(.headline)
}
}
}
struct CardView_Previews: PreviewProvider {
static var scrum = DailyScrum.data[0]
static var previews: some View {
CardView(scrum: scrum)
.background(scrum.color)
.previewLayout(.fixed(width: 400, height: 60))
}
}
タイトルの下にスペーサーを入れて、参加者の人数を表示します。
import SwiftUI
struct CardView: View {
let scrum: DailyScrum
var body: some View {
VStack(alignment: .leading) {
Text(scrum.title)
.font(.headline)
Spacer()
HStack {
Label("\(scrum.attendees.count)", systemImage: "person.3")
}
}
}
}
struct CardView_Previews: PreviewProvider {
static var scrum = DailyScrum.data[0]
static var previews: some View {
CardView(scrum: scrum)
.background(scrum.color)
.previewLayout(.fixed(width: 400, height: 60))
}
}
会議時間を追加して、横幅いっぱいまで広げます。
ついでにフォントサイズも設定します。
import SwiftUI
struct CardView: View {
let scrum: DailyScrum
var body: some View {
VStack(alignment: .leading) {
Text(scrum.title)
.font(.headline)
Spacer()
HStack {
Label("\(scrum.attendees.count)", systemImage: "person.3")
Spacer()
Label("\(scrum.lengthInMinutes)", systemImage: "clock")
.padding(.trailing, 20)
}
.font(.caption)
}
}
}
struct CardView_Previews: PreviewProvider {
static var scrum = DailyScrum.data[0]
static var previews: some View {
CardView(scrum: scrum)
.background(scrum.color)
.previewLayout(.fixed(width: 400, height: 60))
}
}
さらにVStackにPaddingとforegroundColorを設定しましょう。
import SwiftUI
struct CardView: View {
let scrum: DailyScrum
var body: some View {
VStack(alignment: .leading) {
Text(scrum.title)
.font(.headline)
Spacer()
HStack {
Label("\(scrum.attendees.count)", systemImage: "person.3")
Spacer()
Label("\(scrum.lengthInMinutes)", systemImage: "clock")
.padding(.trailing, 20)
}
.font(.caption)
}
.padding()
.foregroundColor(scrum.color.accessibleFontColor)
}
}
struct CardView_Previews: PreviewProvider {
static var scrum = DailyScrum.data[0]
static var previews: some View {
CardView(scrum: scrum)
.background(scrum.color)
.previewLayout(.fixed(width: 400, height: 60))
}
}
ここまでやっておいて気がついたのですが、このままだと
accessibleFontColor
の定義がなくてエラーになります。
実はこのページの最初にある
ここから環境をダウンロードして、そこに修正を入れていかないといけなかったようです。
最初のとこに書いてましたね・・・説明はちゃんと読みましょう・・・
今回はめんどくさいので飛ばします。
.foregroundColor(scrum.color.accessibleFontColor)
の部分はがっつり消すことにします。
アクセシビリティの設定
最後にアクセシビリティ関係を記述して終わりです。
import SwiftUI
struct CardView: View {
let scrum: DailyScrum
var body: some View {
VStack(alignment: .leading) {
Text(scrum.title)
.font(.headline)
Spacer()
HStack {
Label("\(scrum.attendees.count)", systemImage: "person.3")
.accessibilityElement(children: .ignore)
.accessibilityLabel(Text("Attendees"))
.accessibilityValue(Text("\(scrum.attendees.count)"))
Spacer()
Label("\(scrum.lengthInMinutes)", systemImage: "clock")
.padding(.trailing, 20)
}
.font(.caption)
}
.padding()
}
}
struct CardView_Previews: PreviewProvider {
static var scrum = DailyScrum.data[0]
static var previews: some View {
CardView(scrum: scrum)
.background(scrum.color)
.previewLayout(.fixed(width: 400, height: 60))
}
}
ここまででCardViewのプレビューは以下のようになります。
ここまでのまとめ
- プレビュー時にテストデータを渡すことができる
- 説明はちゃんと読もう
次回はCardViewのリスト表示を行います。