๐view.inverseMask()
blend mode - ็จ
.destinationOut
ๅฏไปฅ้ๅฐ้กไผผ็ๆๆใ โญ๏ธ
็ดฐ็ฏ่ชชๆ
ๅจ .inverseMask() ไธญ็จๅฐ็ .foregroundColor(.black) ๅ .backgroud(Color.white)๏ผๅฐ Image ไพ่ชชๆฒๆไปปไฝไฝ็จ๏ผๅฆไธๅๆ็คบ๏ผ

ไฝ .luminanceToAlpha() ๆๅฐๅๅไธญใ้ป่ฒ็้จๅใ่ฝ็บใ้ๆใ(opacity = 0)๏ผ่ใ็ฝ่ฒ็้จๅใๅ่ฝ็บใๅ จ้ปใ(opacity = 1)๏ผ้ๆ็ๅๆ้ปๅ็ธ็็ใๅบ็ใ(่ฒ ็)ใ
ๅฅ็จ .mask() ็ๆๅ๏ผopacity = 1 ็ๆใไฟ็ๅไพ็่ฒๅฝฉใ๏ผopacity = 0 ็้จๅๅ่ฝ็บใ้ๆใใ้ๅฐฑๆฏ็ฒไป้บผๅๅๅฐ็็็ผ็ๅๅจๆฏ่ผ้ป๏ผๆ้ ๆๆๅพ็ๅๅจๅฐ็็ผ็ๅๅจๆไบ้ๆใ
import SwiftUI
import PlaygroundSupport
extension View {
@ViewBuilder
func label(_ text: String) -> some View {
VStack(alignment: .leading) {
self.border(Color.black)
Text(text).padding(.leading).padding(.bottom, 10)
}.border(Color.black)
}
}
let shad = Color.black.opacity(0.8)
let numberPaper = Image("numbers")).resizable().scaledToFill()
.rotationEffect(.degrees(90)).frame(maxWidth: 280)
struct ContentView: View {
let puppy: some View = Image("puppy")).resizable().scaledToFit().frame(width: 150)
var v1: some View { puppy.foregroundColor(.black) } // opacity = 0 (hide)
var v2: some View { v1.background(Color.white) } // opacity = 1 (show)
var v3: some View { v2.compositingGroup() } // โญ๏ธ composite all layers
var v4: some View { v3.luminanceToAlpha() } // โญ๏ธ turn luminance into alpha
var v5: some View {
ZStack {
numberPaper.mask(v4).shadow(color: shad, radius: 4, x: 4, y: 4)
puppy.hidden().border(Color.black)
}.background(Gradient.down(.yellow, .green))
}
var body: some View {
VStack(alignment: .leading) {
HStack {
puppy.label("image")
v1 .label("fg = black")
v2 .label("bg = white")
}
HStack(alignment: .top) {
v4.background(Color.white).label("ไบฎๅบฆ่ฝ alpha")
v5.label("mask(image)")
}
} // container (HStack)
.padding()
.background(Color.gray)
} // body
}
PlaygroundPage.current.setLiveView(ContentView())
Last updated
Was this helpful?