详细列表视图-顶部对齐问题

Detailed list view - top alignment question

7 月 24 日添加:

这行代码修复了详细视图中的 space。但是...在列表视图中,标题也变小了很多。

.navigationBarTitle(Text("Egg management"), displayMode: .inline)

7 月 23 日添加:

感谢提示,我取得了很大进步。特别是添加边框的提示确实很神奇。你看看到底发生了什么!

不过,Xcode预览版canvas、模拟器和实体机之间似乎存在差异。这是一个错误,因为毕竟它仍然是测试版吗?或者有什么我可以做的吗?

正如您在图像中看到的...仅在 Xcode 预览 canvas 视图连接到屏幕顶部。

我认为这与标签栏有关。因为当我用标签栏查看 Xcode 预览 canvas 时...上面的 space 也在那里。知道如何摆脱它吗?


原贴:

这是我的详细列表视图代码:

import SwiftUI

struct ContentDetail : View {

    @State var photo = true

    var text = "Een kip ..."
    var imageList = "Dag-3"
    var day = "3.circle"
    var date = "9 augustus 2019"
    var imageDetail = "Day-3"
    var weight = "35.48"

    var body: some View {

        VStack (alignment: .center, spacing: 10) {

            Text(date)
                .font(.title)
                .fontWeight(.medium)

            ZStack (alignment: .topLeading){

                Image(photo ? imageDetail : imageList)
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .background(Color.black)
                    .padding(.trailing, 0)
                    .tapAction {
                        self.photo.toggle() }

                HStack {
                    Image(systemName: day)
                        .resizable()
                        .padding(.leading, 10)
                        .padding(.top, 10)
                        .frame(width: 40, height: 32)
                        .foregroundColor(.white)

                    Spacer()

                    Image(systemName: photo ?  "photo" : "pencil.circle")
                        .resizable()
                        .padding(.trailing, 10)
                        .padding(.top, 10)
                        .frame(width: 32, height: 32)
                        .foregroundColor(.white)
                }
            }

            Text(text)
                .lineLimit(6)
                .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
                .padding(.leading, 6)

        } .padding(20)

    }
}

#if DEBUG
struct ContentDetail_Previews : PreviewProvider {
    static var previews: some View {
        ContentDetail()
    }
}
#endif

还包括预览 canvas。我不明白的是如何确保文本和照片对齐到顶部(而不是中间)。我尝试使用垫片、填充物等

我想我一定是在监督一些小事……但是。有人能指出我正确的方向吗?谢谢。

添加: 在这两个答案之后,我在最后一个文本之后添加了一个 Spacer() 。在 Xcode 的预览 canvas 中,现在一切正常。但是在我连接的 iPhone 7 Plus 上有一些问题:视图没有与顶部对齐,并且图像被裁剪了(右边的图标消失了;右边的白色条带)。

想想 Spacer() 的作用。它 "moves" 视图尽可能远 - 至少,没有特定的 space.

所以你有这个:

VStack {
    Text
    ZStack {
        Image
        HStack {
            Image
            Spacer()
            Image
        }
    }
    Text
}

总而言之,从 innerouter,你有两个图像的水平堆叠放置得尽可能远(spacer 在它们之间)在 "Z axis" 堆栈内,在它们上面放置图像,在垂直堆栈内,上面有一些文本。

因此,如果您想将垂直堆栈中的所有内容移动到顶部,您只需要最后添加一个 spacer:

VStack {
    Text
    ZStack {
        Image
        HStack {
            Image
            Spacer()
            Image
        }
    }
    Text
    Spacer() // <-- ADD THIS
}

最后一点:不要害怕在您的视图中添加额外的 "stacks"。就内存占用而言,它实际上只是一个 单个 视图,没有性能影响。

编辑: 我采用了您的原始视图并将所有内容更改为占位符...

var body: some View {
    VStack (alignment: .center, spacing: 10) {
        Text("Text #1")
            .font(.title)
            .fontWeight(.medium)
        ZStack (alignment: .topLeading) {
            Text( "Image #1")
            HStack {
                Text("Image #2")
                Spacer()
                Text("Image #3")
            }
        }
        Text("Text #2")
            .lineLimit(6)
            .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
            .padding(.leading, 6)
    } .padding(20)
}

正如预期的那样,所有内容都垂直居中。在 "Text #2" 下面添加一个 Spacer() 会将所有内容都抛到顶部。几个想法:

  • 从这里开始,逐一添加您的 Image 观看次数。也添加这样的修饰符。
  • 我没有你正在渲染的具体图像,所以也许可以在各种东西上放一个明显的背景颜色(橙色是我个人最喜欢的),看看顶部 Image 是不是 实际上在最上面,但图像使它看起来好像不是。边框也可以很好地工作。

在最后一个文本之后添加一个 Spacer() 会将所有内容移到顶部。在 iPhone Xr 模拟器(非预览版)上测试。

   ...

   Text(text)
       .lineLimit(6)
       .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
       .padding(.leading, 6)

   Spacer()
}

要删除顶部的 space:

    VStack {
        ...
    }
    .padding(20)
    .navigationBarTitle("TITLE", displayMode: .inline)