1

所以我试图理解为什么我的子视图(TopView)有奇怪的调整大小问题。

这是示例

import SwiftUI

struct ContentView: View {
    @State var isInterfaceHidden: Bool = false

    var body: some View {
        VStack(spacing: 0, content: {
            if !isInterfaceHidden {
                TopView()
                    .background(Color.yellow)
            }
            Rectangle()
                .foregroundColor(Color.red)
                /// We make sure it won't cover the top and bottom view.
                .zIndex(-1)
            if !isInterfaceHidden {
                Rectangle()
                    .foregroundColor(Color.yellow)
                    .frame(height: 80)
            }
        })
        .navigationBarTitle("")
        .navigationBarHidden(true)
    }
}

struct TopView: View {var body: some View {
        HStack(content: {
            VStack(spacing: 0, content: {
                Text("Text to show, it is a title.")
                    .tracking(0.2)
                    .foregroundColor(.white)
                    .lineLimit(1)
                GeometryReader(content: { geometry in
                    Text("Text to show, it is a subline.")
                        .tracking(0.2)
                        .foregroundColor(.white)
                        .lineLimit(1)
                })
                .background(Color.purple)
            })
        })
        .padding([.leading, .trailing], 20)
    }
}

在此处输入图像描述

我试图设置一个.fixedSize()这样的:

GeometryReader(content: { geometry in
    Text("Text to show, it is a subline.")
        .tracking(0.2)
        .foregroundColor(.white)
        .lineLimit(1)
    })
    .background(Color.purple)

在此处输入图像描述

但它不完全适合文本,所以我不确定这是否是正确的解决方案。你们有什么想法吗?

4

3 回答 3

2

请注意,从 14.0(2020 年 9 月 26 日)开始,GeometryReader 似乎出现了回归 - 或者可能是一种奇妙的未记录的行为变化 - 将布局加权向左上角 - 而不是中心。

这仅出现在我使用 XCode 12 开发和构建的应用程序中——在 iOS 14 上运行的 XCode-11 编译应用程序没有出现此问题。网络上的大多数教程都假设这与它在 iOS 13/XCode 11 中的工作方式相同,并且您的代码可能会以不同的方式运行

iOS 14 已更改(或损坏?)SwiftUI GeometryReader,以解决具有相同问题的更复杂的问题

于 2020-09-28T01:14:18.253 回答
1

frame()据我所知,除非您明确设置为 GeometryReader,否则 GeometryReader 会将父级给定的大小传回其父级。即便如此,如果您想让 GeometryReader 的区域适合Text视图(正是您的自定义视图),您必须使用preferenceor计算自定义视图的高度anchorPreference,然后将其设置为 GeometryReader 的高度,以便让父母知道它需要分配什么大小。

我希望以下链接会有所帮助。
https://swiftui-lab.com/communicating-with-the-view-tree-part-1/

于 2020-09-23T08:20:01.270 回答
0

GeometryReader 适合查看

如果您正在寻找GeometryReader不影响视图大小的,您应该进行反转。你在里面返回的视图GeometryReader应该是 out 的,GeometryReader它本身应该放在那个 View的一个background或一个中。overlay

Text("Text to show, it is a subline.")
    .tracking(0.2)
    .foregroundColor(.white)
    .lineLimit(1)
    .overlay(
        GeometryReader(content: { geometry -> Color in
            print(geometry.frame(in: .global))
            return Color.clear
        })
    )
    .background(Color.purple)

无论哪种方式(背景或覆盖),都可以解决您的问题。换个试试看overlaybackground

只要记住返回 a Color.clear,这样, 就GeometryReader变得不可见并且它不会改变视图。

于 2021-06-06T18:15:34.970 回答