根据其在SwiftUI中的内容,使用具有方形背景的VStack

7tofc5zh  于 2022-10-31  发布在  Swift
关注(0)|答案(1)|浏览(164)

我遇到了一个看似简单的难题...
我的视图有一个宽度小于高度的内容,我希望它显示在一个漂亮的方形卡片中。
这是我在这里所做的:

struct SquareView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .font(.system(size: 100))
                .padding()
                .foregroundColor(.red)
            Text("Yo !")
                .font(.title)
                .fontWeight(.bold)
                .foregroundColor(.orange)
        }
        .aspectRatio(contentMode: .fill) // Same result with or without this line
        .padding()
        .background(Color.white.opacity(0.5))
        .cornerRadius(16)
    }
}

struct SquareView_Previews: PreviewProvider {
    static var previews: some View {
        SquareView()
            .padding(30)
            .background(.yellow)
    }
}

但是aspectRatio位似乎对我希望实现的正方形部分完全没有影响。

在寻找解决方案之后,似乎X1 M1 N1 X要成为我的救世主了...
好吧,那么,这就是我所做的,我几乎成功了:

struct SquareView: View {
    var body: some View {
        ZStack {
            Rectangle()
                .foregroundColor(Color.white.opacity(0.5))
                .aspectRatio(contentMode: .fill)
                .cornerRadius(16)
            VStack {
                Image(systemName: "globe")
                    .font(.system(size: 100))
                    .padding()
                    .foregroundColor(.red)
                Text("Yo !")
                    .font(.title)
                    .fontWeight(.bold)
                    .foregroundColor(.orange)
            }
            .padding()
        }
        .fixedSize()
    }
}

瞧!

没错,它是方形的,但ZStack的大小似乎没有考虑到Rectangle,因为在Xcode中选择它时会确认它:

因此,唯一的解决方案似乎是一个涉及GeometryReader和骄傲使我拒绝这个老年的残余!
“我敢肯定,外面有人知道还有别的办法,我肯定离得很近......这件事上的任何帮助都将不胜感激!”

**EDIT:**我在示例中放置了整个文件,而不仅仅是内容。
**编辑2:**由于@Paulw11的回答,这里是我的示例的完整解决方案。

struct SquareView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .font(.system(size: 100))
                .padding()
                .foregroundColor(.red)
            Text("Yo !")
                .font(.title)
                .fontWeight(.bold)
                .foregroundColor(.orange)
        }
        .padding()
        .background {
            Rectangle()
                .aspectRatio(contentMode: .fill)
                .foregroundColor(.white.opacity(0.5))
                .cornerRadius(16)
        }
    }
}

其结果是:

xtfmy6hx

xtfmy6hx1#

您可以简单地为现有内容设置一个背景,并给予它一个负向插入:

struct CardView: View {
    var body: some View {
       ContentView()
          .background(
               Rectangle()
                .inset(by:-30)
                .aspectRatio(1.0, contentMode:.fill)
                .foregroundColor(.yellow)
          ) 
        }
    }

相关问题