FunctionBuilderを使ってViewに影をつける
FunctionBuilderを使ってViewに影をつける方法です。 FunctionBuilderとViewModifier、どっちを使うか迷う時が良くあります。 関連してこちらもどうぞ。

CardView.swift
import SwiftUI
struct CardView<Content>: View where Content: View {
let color: Color
let radius: CGFloat
let content: () -> Content
init(
color: Color = Color.gray.opacity(0.4),
radius: CGFloat = 8,
@ViewBuilder content: @escaping () -> Content) {
self.content = content
self.color = color
self.radius = radius
}
var body: some View {
content()
.padding(16)
.background(Color.white)
.cornerRadius(16)
.shadow(color: color, radius: radius, x: 4, y: 4)
.padding(radius + 8)
}
}
struct CardView_Previews: PreviewProvider {
static var previews: some View {
CardView {
Text("Snorlax")
}
.previewLayout(.sizeThatFits)
}
}
ContentView.swift
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
CardView {
Text("Snorlax")
}
CardView {
Image("icon")
.resizable()
.frame(width: 60, height: 60)
}
CardView(color: Color.red.opacity(0.4)) {
Text("RedShadow")
}
CardView(
color: Color.green.opacity(0.4),
radius: 24) {
Text("BigShadow")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
