使用“文本”和“图像”视图的蒙版的行为不同

时间:2020-09-16 08:25:09

标签: swiftui

据我所知,当使用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())

结果是:

enter image description here

尽管“文字”遮罩的行为与我预期的一样,但令我惊讶的是,“图像”遮罩却没有。有人知道为什么吗?

---- [已编辑] ----

我的进一步发现:

  1. 如果遮罩设置其.frame()或将其自身设置为.resizable().scaledToFit(),它将自动与其父视图的 center 对齐。
  2. 如果蒙版设置为.resizable().scaledToFit(),则无论您如何设置.frame(),它都会自动缩放以适合其父视图。
  3. 如果对蒙版制作.scaleEffect(),则缩放比例的锚点是其父视图的中心,而不是其自身的中心。

anchor point

0 个答案:

没有答案