import SwiftUI
import PlaygroundSupport
let shad = Color.black.opacity(0.8)
let clear = Image("transparent")
let paper = Image("red-stars").resizable().scaledToFit()
.frame(maxWidth: 280, maxHeight: 200)
struct ContentView: View {
// 0. 設定原圖、圖示大小、整個元件大小。
let mask: some View = IconCard("heart.fill", size: 100)
.frame(width: 150, height: 150)
// 1. 套用 .foregroundColor(),前景塗黑。
// 套用 .luminanceToAlph() 後,alpha = 0,變「透明」,等於「前景被挖掉」。
// ⭐️ 注意:此指令會套用到「所有圖層」,但不會 override 已經有 fgColor 的圖層。
var v1: some View { mask.foregroundColor(.black) }
// 2. 背景塗白
// 套用 .luminanceToAlph() 後,alpha = 1,所以「背景會保留下來」。
var v2: some View { v1.background(Color.white) } // opacity = 1 (show)
// 3. 合併所有圖層
var v3: some View { v2.compositingGroup() }
// 4. 再將亮度調為 alpha
var v4: some View { v3.luminanceToAlpha() }
var v5: some View {
ZStack {
// 紅色星點紙
paper
.mask(v4) // ⭐️ == paper.inverseMask(mask)
.shadow(color: shad, radius: 4, x: 4, y: 4)
// ⭐️ 畫原圖外框,但不顯示原圖。
mask
.hidden()
.border(Color.black)
} // ZStack
.background(Gradient.down(.yellow, .green))
}
var body: some View {
VStack(alignment: .leading) {
HStack {
mask.label("img")
v1 .label("fg = black")
v2 .label("bg = white")
}
HStack(alignment: .top) {
v4
.background(clear) // ⭐️ 底下鋪「透明斜格紙」
.clipped() // ⭐️ 裁掉超出 v4 的部分
.label("亮度轉 alpha")
v5.label("paper.inverseMask(img)")
}
} // container (HStack)
.padding()
.background(Color.gray)
} // body
}
PlaygroundPage.current.setLiveView(ContentView())