使 SwiftUI 矩形与另一个矩形具有相同的高度或宽度

Posted

技术标签:

【中文标题】使 SwiftUI 矩形与另一个矩形具有相同的高度或宽度【英文标题】:Make SwiftUI Rectangle same height or width as another Rectangle 【发布时间】:2020-07-30 03:14:10 【问题描述】:

对于 macOS 应用程序中的 SwiftUI 布局,我有三个矩形,如下所示:

产生这个布局的代码是:

import SwiftUI

struct ContentView: View 
    var body: some View 
        VStack 
            HStack 
                ZStack 
                    Rectangle()
                        .fill(Color.purple)
                        .frame(width: 20)
                    Text("1")
                        .font(.subheadline)
                        .foregroundColor(.white)
                
                
                ZStack 
                    Rectangle()
                        .fill(Color.orange)
                    Text("2")
                        .font(.subheadline)
                        .foregroundColor(.white)
                
            
            
            HStack                 
                ZStack 
                    Rectangle()
                        .fill(Color.red)
                        .frame(height: 20)
                    Text("3")
                           .font(.subheadline)
                           .foregroundColor(.white)
                
            
        
        .frame(minWidth: 400, minHeight: 250)
    

我的目标是矩形 1 与矩形 2 的高度相同,矩形 3 的宽度与矩形 2 相同。矩形之间的大小关系应随着窗口大小的变化而保持不变。正确完成后,最终结果应如下所示:

如何在 SwiftUI 中实现这一点?

【问题讨论】:

【参考方案1】:

这是一种基于视图偏好的工作方法。使用 Xcode 11.4 / macOS 10.15.6 测试

struct ViewWidthKey: PreferenceKey 
    typealias Value = CGFloat
    static var defaultValue: CGFloat  0 
    static func reduce(value: inout Value, nextValue: () -> Value) 
        value = value + nextValue()
    


struct ContentView: View 
    @State private var boxWidth = CGFloat.zero
    var body: some View 
        VStack 
            HStack 
                ZStack 
                    Rectangle()
                        .fill(Color.purple)
                        .frame(width: 20)
                    Text("1")
                        .font(.subheadline)
                        .foregroundColor(.white)
                

                ZStack 
                    Rectangle()
                        .fill(Color.orange)
                    Text("2")
                        .font(.subheadline)
                        .foregroundColor(.white)
                
                .background(GeometryReader 
                    Color.clear.preference(key: ViewWidthKey.self,
                        value: $0.frame(in: .local).size.width) )
            

            HStack 
                ZStack 
                    Rectangle()
                        .fill(Color.red)
                        .frame(height: 20)
                    Text("3")
                           .font(.subheadline)
                           .foregroundColor(.white)
                .frame(width: boxWidth)
            .frame(maxWidth: .infinity, alignment: .bottomTrailing)
        
        .onPreferenceChange(ViewWidthKey.self)  self.boxWidth = $0 
        .frame(minWidth: 400, minHeight: 250)
    

【讨论】:

这很好用。谢谢你。对于这样一个简单的任务,似乎有很多代码。

以上是关于使 SwiftUI 矩形与另一个矩形具有相同的高度或宽度的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 调整矩形以适应内容

SwiftUI - 文本和形状位置之间的不一致

直方图中的最大矩形

Swift UI设置制作矩形正方形

如何将图像从不规则矩形更改为矩形?

我无法获得连续的画布矩形在js中具有重复的线性渐变。谁知道怎么样?