How to create custom ViewModifiers in SwiftUI | Advanced Learning #1
Text
, Button
등 뷰 컴포넌트를 구성하는 모디파이어struct DefaultButtonViewModifier: ViewModifier {
let backgroundColor: Color
func body(content: Content) -> some View {
content
.foregroundColor(.white)
.frame(height: 55)
.frame(maxWidth: .infinity)
.background(backgroundColor)
.cornerRadius(10)
.shadow(radius: 10)
}
}
extension View {
func withDefaultButtonFormmating(_ backgroundColor: Color = .blue) -> some View {
// RETURN BODY
modifier(DefaultButtonViewModifier(backgroundColor: backgroundColor))
}
}
ViewModifier
프로토콜을 준수하는 뷰 모디파이어 구조체는 body
라는 이름의 함수가 content
를 입력받고 View
를 리턴한다. Text
가 일종의 content
이고, 이 뷰에 모디파이어로 추가할 폰트, 패딩, 백그라운드 컬러 등을 모디파이어 단에 단 뒤 결과를 리턴함extension
을 통해 뷰 모디파이어를 구현할 시 확장성 확보 가능import SwiftUI
struct DefaultButtonViewModifier: ViewModifier {
let backgroundColor: Color
func body(content: Content) -> some View {
content
.foregroundColor(.white)
.frame(height: 55)
.frame(maxWidth: .infinity)
.background(backgroundColor)
.cornerRadius(10)
.shadow(radius: 10)
}
}
extension View {
func withDefaultButtonFormmating(_ backgroundColor: Color = .blue) -> some View {
// RETURN BODY
modifier(DefaultButtonViewModifier(backgroundColor: backgroundColor))
}
}
struct ViewModifierBootCamp: View {
var body: some View {
VStack(spacing: 10) {
Text("HELLO WORLD")
.font(.headline)
.foregroundColor(.white)
.frame(height: 55)
.frame(maxWidth: .infinity)
.background(Color.blue)
.cornerRadius(10)
.shadow(radius: 10)
Text("HELLO WORLD2")
.font(.headline)
.modifier(DefaultButtonViewModifier(backgroundColor: .blue))
Text("HELLO WORLD3")
.font(.headline)
.withDefaultButtonFormmating()
Text("HELLO WORLD4")
.font(.headline)
.withDefaultButtonFormmating(.red)
}
.padding()
}
}