swift - 在 SwiftUI 中使用获取 View 的宽度

标签 swift swiftui frame

我需要在 SwiftUI 中获取渲染 View 的宽度,这显然不是那么容易。

我的看法是我需要一个返回 View 维度的函数,就这么简单。

var body: some View {
    VStack(alignment: .leading) {
        Text(timer.name)
            .font(.largeTitle)
            .fontWeight(.heavy)
        Text(timer.time)
            .font(.largeTitle)
            .fontWeight(.heavy)
            .opacity(0.5)
    }
}

最佳答案

获取View 尺寸的唯一方法是使用GeometryReader。读取器返回容器的尺寸。

什么是几何阅读器?文档说:

A container view that defines its content as a function of its own size and coordinate space. Apple Doc

所以你可以通过这样做来获得尺寸:

struct ContentView: View {
    
   @State var frame: CGSize = .zero
    
    var body: some View {
        HStack {
            GeometryReader { (geometry) in
                self.makeView(geometry)
            }
        }
        
    }
    
    func makeView(_ geometry: GeometryProxy) -> some View {
        print(geometry.size.width, geometry.size.height)

        DispatchQueue.main.async { self.frame = geometry.size }

        return Text("Test")
                .frame(width: geometry.size.width)
    }
}

打印的尺寸是作为内部 View 容器的HStack的尺寸。

您可能会使用另一个 GeometryReader 来获取内部维度。

但请记住,SwiftUI 是一个声明式框架。所以你应该避免计算 View 的维度:

阅读更多示例:

关于swift - 在 SwiftUI 中使用获取 View 的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57577462/

相关文章:

ios - defaultTracker 在 Google Analytics for IOS 中为 nil

ios - 快速功能完成

json - 如何使用 autoID 解码 Firebase JSON

swiftui - 无法将 'Binding<Int>' 类型的值转换为预期的参数类型 'Binding<_>'

ios - SwiftUI 无法关闭显示的第二个工作表

java - 创建一个只有可见边框的框架来选择屏幕区域

swift - NSFetchedResultsController 不从后台上下文(DATAStack)更新

ios - SwiftUI Preview 不适用于 FetchRequest 和 Init

c - 使用 RtlVirtualUnwind api 检索参数

框架内的JAVA按钮生成图表