代码是这样的:

struct ContentView: View {
    
    @State var r:CGFloat = 1
    
    var body: some View {
        
        VStack(spacing:0) {
            Color.red
                .aspectRatio(r, contentMode: .fit)
            HStack {
                Text("LEFT")
                Spacer()
                Text("Right")
            }
            .frame(height: 40)
            .background(Color.blue)
        }
        
    }
}

#Preview {
    ContentView()
}

它简单地画出了这样的东西:

enter image description here

我希望HStack遵循我设置的比率为Color.red的宽度.

因此,Color.red的比率可以改变,我希望HStack具有与Color.red完全相同的宽度

随着r的变化,如何使HStack的宽度与Color.red视图的宽度匹配?

推荐答案

您可以使用GeometryReader读取Color.red的大小,并使用PreferenceKey将其传回层次 struct :

struct ContentView: View {
    @State private var r:CGFloat = 1
    @State private var redWidth: CGFloat = 0
    
    var body: some View {
        VStack(spacing:0) {
            Color.red
                .aspectRatio(r, contentMode: .fit)
                .readSize { redWidth = $0.width }
            HStack {
                Text("LEFT")
                Spacer()
                Text("Right")
            }
            .frame(width: redWidth, height: 40)
            .background(Color.blue)
        }
        
    }
}

extension View {
  func readSize(onChange: @escaping (CGSize) -> Void) -> some View {
    background(
      GeometryReader { geometryProxy in
        Color.clear
          .preference(key: SizePreferenceKey.self, value: geometryProxy.size)
      }
    )
    .onPreferenceChange(SizePreferenceKey.self, perform: onChange)
  }
}

struct SizePreferenceKey: PreferenceKey {
  static var defaultValue: CGSize = .zero
  static func reduce(value: inout CGSize, nextValue: () -> CGSize) {}
}

https://www.fivestars.blog/articles/swiftui-share-layout-information/

Swift相关问答推荐

Swift Tree实现中的弱var

可编码:将字符串解码为自定义类型(ISO 8601日期,无时间组件)

如何在SWIFT中解码Instagram Backup中的字符串?

按下一步后无法让文本字段切换焦点

可以将属性名称传递给 Swift 中的函数吗?

为什么Swift可以在没有足够信息的情况下推断类型?

memcpy 复制带偏移量的数组

如何在类中打印函数

MainActor 隔离可变存储属性为何会出现可发送错误?

Swift - 给定一个像 30 的 Int 如何将范围数乘以 7?

在 Swift 中实现自定义异步序列

符合协议要求委托变量在 ios13 中可用

Swift 函数 vs 惰性变量 vs 计算(computed)属性 - 区别?

是否可以在 Swift 中创建通用闭包?

Swiftwhere数组扩展

FCM 后台通知在 iOS 中不起作用

如何快速截取 UIView 的屏幕截图?

try 在解除分配时加载视图控制器的视图... UIAlertController

如何在 GCD 中停止 DispatchWorkItem?

如何在 SwiftUI 中创建带有图像的按钮?