如何使矩形的高度与 VStack 的高度相同

Posted

技术标签:

【中文标题】如何使矩形的高度与 VStack 的高度相同【英文标题】:How to make a rectangle's height the same height of a VStack 【发布时间】:2020-06-01 21:07:18 【问题描述】:

我有一个 swift 视图,它由一个带有矩形的 HStack 和一个内部文本的 Vstack 组成。我想让矩形的高度与 Vstack 的高度相同。我已经尝试在 *** 上查看许多其他问题,但没有找到答案。有人可以帮我做吗?

这是我的代码:

struct TodoView: View 
    @State var todos = ["feed the dog", "take the dog out for a walk", "make coffee"]
    @State var height: CGFloat = 45
    var body: some View 
                HStack
                    RoundedRectangle(cornerRadius: 2)
                        .frame(width: 1)
                        .foregroundColor(Color("lightGray"))
                        .padding()
                    VStack

                        Text("Todo")
                            .font(.title)
                        ForEach(todos, id: \.self) todo in
                            Text(todo)
                        
                    

                    Spacer()
        
    

【问题讨论】:

【参考方案1】:

您需要知道 GeometryReader 和 PreferenceKey 才能做到这一点。

struct SiblingHeightKey: PreferenceKey 
    static var defaultValue: CGSize? 
        nil
    

    static func reduce(value: inout CGSize?, nextValue: () -> CGSize?) 
        value = value ?? nextValue()
    


struct TodoView: View 
    @State var vStackSize: CGSize? = nil
    @State var todos = ["feed the dog", "take the dog out for a walk", "make coffee"]
    @State var height: CGFloat = 45
    var body: some View 
                HStack
                    RoundedRectangle(cornerRadius: 2)
                        .foregroundColor(.gray)
                        .frame(width: self.vStackSize?.width, height: self.vStackSize?.height)
                    VStack

                        Text("Todo")
                            .font(.title)
                        ForEach(todos, id: \.self) todo in
                            Text(todo)
                        
                    .background(
                        GeometryReader  proxy in
                            Color.clear.preference(key: SiblingHeightKey.self, value: proxy.size)
                        
                    )

                    Spacer()
                .onPreferenceChange(SiblingHeightKey.self) 
                    self.vStackSize = $0
        
    

【讨论】:

SiblingHeightKey 指的是什么? 已更新答案 我在“Color.clear.preference(key: SiblingHeightKey.self, value: proxy.size) ”行上收到一条错误消息,显示“线程 1:signal SIGBART” 你的错误一定在其他地方,试试这段代码。【参考方案2】:

你可以使用.frame修饰符:

HStack
    RoundedRectangle(cornerRadius: 2)
        .frame(width: 1, height: 50)
        .foregroundColor(Color("lightGray"))
        .padding()
    VStack 
        Text("Todo")
            .font(.title)
        ForEach(todos, id: \.self) todo in
            Text(todo)
        
        .frame(height: 50)
    
    Spacer()

如果你想让它们填满整个View

.frame(minWidth: 0, maxWidth: .infinity)

或者,您可以使用此处建议的GeometryReader:Make a grid of buttons of same width and height in SwiftUI。

【讨论】:

以上是关于如何使矩形的高度与 VStack 的高度相同的主要内容,如果未能解决你的问题,请参考以下文章

如何使光标的高度与 UITextField 中的文本高度相同?

即使大于高度,如何将 VStack 对齐到顶部?

如何使下拉菜单的高度与引导程序4中子菜单的高度相同

如何使子div高度与父div高度相同

如何在 SwiftUI 中根据其子级高度设置 GeometryReader 高度?

如何使 iframe 的宽度和高度与其父 div 相同?