据我所知,当使用mask()修饰符时,遮罩会与其父视图的上导角对齐(除非您设置了遮罩的框架或对其进行缩放) 。我一直在努力理解这个概念,因此编写了以下代码:
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
// background image
let image: some View = Image("xxx.jpg"))
.resizable().scaledToFit().frame(maxWidth: 300)
// image mask
let imageMask: some View = Image(systemName: "heart.fill")
.resizable().scaledToFit().frame(width: 100).opacity(0.8)
// text mask
let textMask: some View = Text("SwiftUI is Awesome!")
.font(.title).fontWeight(.bold)
// body
var body: some View {
HStack {
VStack {
image.overlay(imageMask.border(Color.blue), alignment: .topLeading)
image.mask(imageMask)
}.border(Color.blue)
VStack {
image.overlay(textMask.border(Color.blue), alignment: .topLeading)
image.mask(textMask)
}.border(Color.blue)
}
}
}
PlaygroundPage.current.setLiveView(ContentView())
结果是:
尽管“文字”遮罩的行为与我预期的一样,但令我惊讶的是,“图像”遮罩却没有。有人知道为什么吗?
---- [已编辑] ----
我的进一步发现:
.frame()
或将其自身设置为.resizable()
或.scaledToFit()
,它将自动与其父视图的 center 对齐。 .resizable()
或.scaledToFit()
,则无论您如何设置.frame()
,它都会自动缩放以适合其父视图。.scaleEffect()
,则缩放比例的锚点是其父视图的中心,而不是其自身的中心。