我需要在SwiftUI
中获得渲染视图的宽度,这显然不是那么容易。
我的看法是,我需要一个返回视图维度的函数,就这么简单。
var body: some View {
VStack(alignment: .leading) {
Text(timer.name)
.font(.largeTitle)
.fontWeight(.heavy)
Text(timer.time)
.font(.largeTitle)
.fontWeight(.heavy)
.opacity(0.5)
}
}
3条答案
按热度按时间mnemlml81#
获取视图维度的唯一可用机制是
GeometryReader
,该视图由SwiftUI自动调整大小。GeometryReader
是一个代理视图,它返回呈现视图的容器的维度。打印尺寸为
VStack
的尺寸。如何获取视图的维度
现在我们知道了
GeometryReader
为我们提供了容器的大小,接下来通常的问题是:我如何使用它来获得特定视图的大小?要做到这一点,我们需要将几何阅读器移动到目标视图的下一层。怎么做?我们可以添加一个空的背景来获取目标视图的大小,并将此信息发送回一个
Binding
。让我们创建一个
SizeCalculator
ViewModifier
,这样我们就可以在每个视图上使用此功能:SizeCalculator
的任务是添加一个GeometryReader
作为目标视图的背景,在SwiftUI渲染content
之后,它会将大小发送回Binding
。用法:
9njqaruj2#
获取子视图的尺寸是任务的第一部分。将尺寸值冒泡是第二部分。
GeometryReader
获取父视图的尺寸,这可能不是您想要的。要获取所讨论的子视图的尺寸,我们可以在具有实际大小的子视图上调用修饰符,例如.background()
或.overlay()
下面是获取当前视图大小并对其执行操作的另一种方便方法:
readSize
函数。用法:
kyks70gy3#
使用
GeometryReader
有一个更简单的方法来获取视图的宽度,你需要创建一个状态变量来存储宽度,然后用GeometryReader
包围所需的视图,并将宽度值设置为该宽度内的几何图形。注意,如果目标的视图也改变了,宽度也会改变。如果你想存储它,我建议在其他地方使用let常量。希望能有所帮助!