SwiftUI WidgetKit文本和图像对齐

SwiftUI WidgetKit文本和图像对齐,swiftui,widgetkit,Swiftui,Widgetkit,我正在尝试用两个文本标签和一个图像创建一个小部件扩展。这两个标签需要位于左上角,图像需要位于右下角。我一直无法使它正常工作 有没有一种正确的方法可以做到这一点,而不必使用我不需要的间隔符()或覆盖图像。对SwiftUI来说非常陌生。任何帮助或指点都将不胜感激 VStack (alignment: .leading){ Text("Title") .font(.headline) .f

我正在尝试用两个文本标签和一个图像创建一个小部件扩展。这两个标签需要位于左上角,图像需要位于右下角。我一直无法使它正常工作

有没有一种正确的方法可以做到这一点,而不必使用我不需要的间隔符()或覆盖图像。对SwiftUI来说非常陌生。任何帮助或指点都将不胜感激

   VStack (alignment: .leading){
            Text("Title")
                .font(.headline)
                .fontWeight(.regular)
                .lineLimit(1)
            Text("subtitle")
                .font(.title3)
                .fontWeight(.bold)
                .lineLimit(1)
                .allowsTightening(true)
            HStack {
                Spacer(minLength: 15)
                Image("fish")
                    .resizable()
                    .frame(width: 120, height: 80)
            }
        }
        .padding(.top)
        .padding(.leading)

有很多方法可以构建这样的布局。您所拥有的功能几乎可以正常工作,您只需在文本和图像之间设置一个
间隔符
,即可将图像向下推:

VStack (alignment: .leading) {
    Text("Title")
        .font(.headline)
        .fontWeight(.regular)
        .lineLimit(1)
    Text("subtitle")
        .font(.title3)
        .fontWeight(.bold)
        .lineLimit(1)
        .allowsTightening(true)
    Spacer(minLength: 0)  // <-- add spacer here
    HStack {
        Spacer(minLength: 15)
        Image("fish")
            .resizable()
            .frame(width: 120, height: 80)
    }
}
.padding(.top)
.padding(.leading)
或者,如果您想要固定大小的图像,并且希望文本在较小的屏幕上重叠,您可以使用如下
ZStack

VStack(alignment: .leading) {
    Text("Title")
        .font(.headline)
        .fontWeight(.regular)
    Text("subtitle")
        .font(.title3)
        .fontWeight(.bold)
        .allowsTightening(true)

    Spacer(minLength: 0)

    Image("fish")
        .resizable()
        .aspectRatio(3/2, contentMode: .fit)
}
.lineLimit(1)
.padding(.leading)
.padding(.top)
ZStack(alignment: .bottomTrailing) {

    Image("fish")
        .resizable()
        .frame(width: 120, height: 80)

    VStack (alignment: .leading) {
        Text("Title")
            .font(.headline)
            .fontWeight(.regular)
        Text("subtitle")
            .font(.title3)
            .fontWeight(.bold)
            .allowsTightening(true)
    }
    .lineLimit(1)
    .padding()
    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
}

正如我所说,有很多方法可以解决这个问题

我想我已经设法让它工作了,并且尽可能地接近它。看起来比以前好多了。稍微满意,但现在正在工作

ZStack {
        VStack (alignment: .leading){
            Text("Title")
                .font(.body)
                .fontWeight(.bold)
                .lineLimit(1)
                .allowsTightening(true)
            Text("subtitle")
                .font(.title)
                .fontWeight(.regular)
            HStack(alignment: .bottom){
                Spacer()
                Image("fish")
                    .resizable()
                    .frame(width: 120, height: 80)
                    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing)
                    .offset(x: 5, y: -10)
                    // padding for images with frame bigger than actual image
            }
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading)
        }
        .padding(12)
    }
    .background(Color(UIColor.secondarySystemBackground))

非常感谢。我对swiftui非常陌生,天生就是目标c,所以我不确定是否只有一种正确的方法可以做到这一点。非常感谢这些伟大的代码示例!不客气!