๐view.inverseMask()
Last updated
Was this helpful?
Last updated
Was this helpful?
่ช่ฃฝ็้ฎ็ฝฉ๏ผไฝ็จๅๅฅฝ่ทๅฎๆน็ .mask() ็ธๅใ
blend mode - ็จ .destinationOut
ๅฏไปฅ้ๅฐ้กไผผ็ๆๆใ โญ๏ธ
import SwiftUI
extension View {
// view.inverseMask(_:)
public func inverseMask<M: View>(_ mask: M) -> some View {
// exchange foreground and background
let inversed = mask
.foregroundColor(.black) // opacity = 0 (hide)
.background(Color.white) // opacity = 1 (show)
.compositingGroup() // โญ๏ธ composite all layers
// โญ๏ธ dark -> transparent (opacity = 0)
// bright -> opaque black (opacity = 1)
// ๆ้ปใ่ฒ ็ใ็ๆ่ฆบใ
.luminanceToAlpha() // โญ๏ธ turn luminance into alpha (opacity)
return self.mask(inversed)
}
}
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
var body: some View {
// light bulb (resizable image)
let lightbulb = Image(systemName: "lightbulb")
.resizable().scaledToFit().padding(24)
// rounded rect (shape)
let roundedRect = RoundedRectangle(cornerRadius: 20)
// rounded gradient border
let border = roundedRect
.stroke(Neu.gradient.diagonalBorderDark, lineWidth: 2)
// card container
return ZStack {
// card background
Neu.color.grayBackground
// card
Neu.gradient.horizontalDark
.inverseMask(lightbulb) // โญ๏ธ inverse mask
.shadow(color: Color.black.opacity(0.6), radius: 4, x: 4, y: 4)
.frame(width: 150, height: 200)
.clipShape(roundedRect)
.overlay(border)
.shadow(color: Color.white.opacity(0.9), radius: 18, x: -18, y: -18)
.shadow(color: Color.black.opacity(0.3), radius: 14, x: 14, y: 14)
}
}
}
PlaygroundPage.current.setLiveView(ContentView())
How to Create a Neumorphic Design With SwiftUI - RayWenderlich
Inverted mask swiftui with system image -
destinationView
mask.blendMode(.destinationOut) // source view (mask)
ๅจ .inverseMask() ไธญ็จๅฐ็ .foregroundColor(.black) ๅ .backgroud(Color.white)๏ผๅฐ Image ไพ่ชชๆฒๆไปปไฝไฝ็จ๏ผๅฆไธๅๆ็คบ๏ผ
ไฝ .luminanceToAlpha() ๆๅฐๅๅไธญใ้ป่ฒ็้จๅใ่ฝ็บใ้ๆใ(opacity = 0)๏ผ่ใ็ฝ่ฒ็้จๅใๅ่ฝ็บใๅ จ้ปใ(opacity = 1)๏ผ้ๆ็ๅๆ้ปๅ็ธ็็ใๅบ็ใ(่ฒ ็)ใ
ๅฅ็จ .mask() ็ๆๅ๏ผopacity = 1 ็ๆใไฟ็ๅไพ็่ฒๅฝฉใ๏ผopacity = 0 ็้จๅๅ่ฝ็บใ้ๆใใ้ๅฐฑๆฏ็ฒไป้บผๅๅๅฐ็็็ผ็ๅๅจๆฏ่ผ้ป๏ผๆ้ ๆๆๅพ็ๅๅจๅฐ็็ผ็ๅๅจๆไบ้ๆใ
็ธฝไน๏ผmask ๅๅไธญๆฏ่ผ็ฝ็้จๅ๏ผไฝ็บใ่ขซๅช่ฃๅฐ่ฑกใ็็ธๅฐ้จๅๆ่ขซไฟ็ไธไพ๏ผmask ๅๅไธญ่ผ้ป็้จๅๅ่ฝ็บ้ๆ๏ผ่ณๆผ่ถ ๅบ mask ๅๅ็ฏๅ็้จๅ๏ผๅ็ดๆฅ่ขซ่ฃๆใ โ ๏ธ ไฝๆณจๆ๏ผๅๅฎ .mask() ไนๅพ๏ผframe ็ๅคงๅฐ้ๆฏๅไพใ่ขซๅช่ฃๅฐ่ฑกใ็ๅคงๅฐๅ๏ผ
ๅฐๆผไธๅผต็ ง็ photo ไพ่ชช๏ผ paper.inverseMask(photo) == paper.mask(photo.luminanceToAlpha()) photo ่ผๆทก็้จๅ๏ผpaper ๆ่ฎ้ๆไธไบใ
ไฝ paper.mask(photo) ๅๆๅฎๅ จไฟ็ paper ็้ก่ฒ๏ผๅชๆ paper ๅจ photo ไปฅๅค็้จๅ่ฃๆ่ๅทฒ๏ผ้ๅฏ่ฝๆฏๅ ็บ photo ็ ง็ๆฌไพ็ๆฏๅๅ็ด opacity = 1 ็็ทฃๆ ใ
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())
ๅ ไธ้ป่ฒๅๆฏใ็ฝ่ฒ่ๆฏ้ฝๆๆ๏ผ้ๆๆๆๅ ฉๅๅๅฑค๏ผๅฅ็จ .compositingGroup() ๆๅไฝตๅๅฑคใๅไฝตๅพ๏ผๅๅฅ็จ .luminanceToAlpha()๏ผmask ๅๅๅๆฏ็้จๅ (ไนๅฐฑๆฏๅไพๅ็คบ็้จๅ) ่ฝ็บ้ๆ๏ผ้ๆๅๅฅ็จ .mask() ๅฐฑๅฏไปฅใๆๆใๅๅ็้ๅ้จๅ๏ผ้ไนๅฐฑๆฏ็บไป้บผ .inverseMask() ๆๆๆ็ๅๅ ใ
import SwiftUI
import PlaygroundSupport
let shad = Color.black.opacity(0.8)
let clear = Image(uiImage: #imageLiteral(resourceName: "IMG_0328.PNG"))
let paper = Image(uiImage: #imageLiteral(resourceName: "red stars.PNG"))
.resizable().scaledToFit()
.frame(maxWidth: 280, maxHeight: 200)
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)
}
}
struct ContentView: View {
let mask: some View = Image(systemName: "cloud.drizzle.fill").resizable().scaledToFit().frame(width: 150)
var v1: some View { mask.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 {
paper.mask(v4).shadow(color: shad, radius: 4, x: 4, y: 4)
mask.hidden().border(Color.black)
}.background(Gradient.down(.yellow, .green))
}
var body: some View {
VStack(alignment: .leading) {
HStack {
mask.label("image")
v1 .label("fg = black")
v2 .label("bg = white")
}
HStack(alignment: .top) {
v4.background(clear).clipped().label("ไบฎๅบฆ่ฝ alpha")
v5.label("mask(image)")
}
} // container (HStack)
.padding()
.background(Color.gray)
} // body
}
PlaygroundPage.current.setLiveView(ContentView())