Viewを定義する
Published by @SoNiceInfo at 6/24/2020
View
を自分で定義することで使い回すことができます。
さらに別ファイルで定義して呼び出すこともできます。
Viewとは
SwiftUIにおいてView
は非常に重要です。
構造体を定義する際にView
プロトコルに準拠させてbodyに表示したいView
を記述することによりView
を作成できます。View
内でView
を呼び出すことによりアプリのUIが完成します。
実はText
, Image
, HStack
といった要素はすべてView
です。
Viewの作り方
View
を自分で定義して同じコードをひとつにまとめることで開発・メンテナンスが楽になります。View
を作成する基本の型はこの様になっていて、別のView
からViewName()
で呼び出せます。
struct ViewName: View {
var body: some View {
Text("This is custom View")
}
}
Viewの作成例
ここではEmojiTile
というView
を作成します。EmojiTile
は受け取った文字列と色を使ってそのとおりに表示する正方形のようなView
です。Text
に文字列、background
で色を指定することで表示できます。View
では様々なModifier(修飾子)が利用できますがここではpadding
(余白)とcornerRadius
(角丸)を利用しています。EmojiTile
が準備できたらContentView
内で呼び出します。VStack
で縦にEmojiTile
を並べて表示します。
//
// ContentView.swift
//
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
EmojiTile(text: "😀", color: .blue)
EmojiTile(text: "😉", color: .green)
EmojiTile(text: "😊", color: .purple)
EmojiTile(text: "😀", color: .blue)
}
}
}
struct EmojiTile: View {
var text: String
var color: Color
var body: some View {
Text(text)
.font(.custom("Emoji", size: 50))
.padding(50)
.background(color)
.cornerRadius(10)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Viewを別ファイルに書き出す
自分で定義してパーツ化したView
は別ファイルに書き出すことができます。ContentView.swift
にすべて書いていくと可読性が下がっていくので別ファイルに書き出します。
ここではEmojiTile
をEmojiTile.swift
というファイルに書き出します。
//
// ContentView.swift
//
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
EmojiTile(text: "😀", color: .blue)
EmojiTile(text: "😉", color: .green)
EmojiTile(text: "😊", color: .purple)
EmojiTile(text: "😀", color: .blue)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
//
// EmojiTile.swift
//
import SwiftUI
struct EmojiTile: View {
var text: String
var color: Color
var body: some View {
Text(text)
.font(.custom("Emoji", size: 50))
.padding(50)
.background(color)
.cornerRadius(10)
}
}
struct EmojiTile_Previews: PreviewProvider {
static var previews: some View {
EmojiTile(text: "", color: .blue)
}
}