【问题标题】:Detailed list view - top alignment question详细列表视图 - 顶部对齐问题
【发布时间】:2019-07-21 20:19:03
【问题描述】:

7 月 24 日添加:

这行代码修复了详细视图中的空间。但是...在列表视图中,标题也变得更小了。

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

7 月 23 日添加:

感谢提示,我取得了很大进步。尤其是添加边框的技巧确实很神奇。你明白会发生什么!

但是,Xcode Preview 画布、模拟器和物理设备之间似乎存在差异。这是一个错误,因为 - 毕竟 - 它仍然是测试版吗?或者有什么我可以做的吗?

正如您在图片中看到的那样……只有在 Xcode 预览画布中,视图才连接到屏幕顶部。

我相信它与标签栏有关。因为当我用标签栏查看 Xcode Preview 画布时......上面的空间也在那里。知道如何摆脱它吗?


原帖:

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

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

还包括预览画布。我没有得到的是如何确保文本和照片与顶部(而不是中间)对齐。我尝试过使用 Spacers、padding 等。

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

添加: 在两个答案之后,我在最后一个文本之后添加了一个 Spacer() 。在预览画布中的 Xcode 中,现在一切看起来都很好。但在我连接的 iPhone 7 Plus 上存在一些问题:视图未与顶部对齐,图像被裁剪(右侧图标消失;右侧出现白色条纹)。

【问题讨论】:

  • 对不起,我没有订阅你的问题,所以我只有在你评论我的回答时才收到通知。我现在才看到你的更新。我看到你取得了很大的进步。关于预览,我在开始使用 SwiftUI 的第二天就放弃了它们,并且再也没有回头。至少在 GM 之前,我不打算使用它们。在他们目前的状态下,我不信任他们,我认为他们是在浪费时间。必须仔细检查一切!此外,当您得到不同的结果时,可能有 99% 的情况是预览错误。
  • 谢谢。顺便说一句,您网站上的精彩文章(SwiftUI 的 Layout Magic)。

标签: swiftui


【解决方案1】:

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

   ...

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

   Spacer()
}

删除顶部的空间:

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

【讨论】:

  • 若要进一步排除故障,请告诉我们您图片的确切尺寸,以便我们重现问题。我的意思是文件上图像的实际像素(不是显示方式)。另请注意,理解(然后排除故障)布局问题的最佳工具之一是在各处添加边框。这样您就可以准确地看到每个容器占用了多少空间。结果可能会让你大吃一惊。首先为您的 VStack 和 ZStack 添加边框。请注意,如果没有显示边框,可能是因为它正位于另一个边框的后面。
  • 此外,如果您将 aspectRatio 从 .fit 更改为 .fill,则可以删除图像右侧的空间。
  • 最后,从您的屏幕截图来看,顶部的空白区域似乎是由于您位于 NavigationView 内部这一事实而引入的。你摆脱它,你可以让导航栏标题.inline。我会更新我发布的答案。
  • 好的。因为我想尽可能多地学习它......我先潜入一点。我还在那个视图/屏幕上添加了一些额外的内容,所以我必须先完成它(否则它是一个移动的目标)。感谢您的建议!
【解决方案2】:

想想Spacer() 做了什么。它将视图“移动”到尽可能远的距离——至少,没有特定的空间。

所以你有这个:

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

总而言之,从 innerouter,你有一个水平堆叠的两个图像,它们彼此相距很远(间隔在它们之间)在一个“Z轴”堆栈,将图像放在它们的顶部,在垂直堆栈内部,上面有一些文本。

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

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

最后一点:不要害怕在视图中添加额外的“堆栈”。就内存占用而言,它实际上只是一个单个视图,不会影响性能。

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

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 是否真的在顶部,但图像使它看起来好像不是。边框也可以很好地工作。

【讨论】:

  • 谢谢。当我在 Preview Canvas 中添加 Spacer 时,一切看起来都很好,就像 Kontiki 发布的屏幕一样。然而,在我连接的 iPhone 7 Plus 上,顶部和第一个文本之间仍有很大的空间。另外...在我的 iPhone 7 Plus 上,图像要小得多。我将在我的原始帖子中添加屏幕转储。
  • @arakweker,听起来你更了解Spacer 的作用。这是首先需要的。您似乎有一些Views的修饰符相关的其他问题放置在您的堆栈中。可能与填充、分隔线等有关。(对于Image,别忘了,它更像是UIImageView 而不是UIImage,是的,我知道你知道resizable。)我很高兴我帮助。是的,这些细节(连同@kontiki)应该能让你走完剩下的路。请发布更新。我们将相应地编辑我们的答案。
猜你喜欢
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2020-08-23
  • 2020-12-18
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多