Swift-IOS:如何从布局中测量项目的高度和宽度



我有一个collectionviewcell,其中包含多个文本字段、图片和标签。数据是动态添加的,可以有更短或更长的标签和图片,使集合视图的每个单元格都具有不同的高度和宽度。我想用程序测量我的集合viewcell的宽度和高度,以完成多项任务,其中还包括根据不同方向根据我的单元格的宽度和高设置列数。有什么想法可以测量宽度和高度吗?布局是在主情节板上绘制的,没有任何额外的xib。我将非常感谢的回复

使用AutoLayout设置UI。并将集合视图布局设置为以下代码:

let layout = UICollectionViewFlowLayout()
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

你不需要测量单元格的大小,系统就能完成所有操作。

如果您想自己测量,最好缓存单元格的大小以获得更好的性能。

一般来说,您不必知道视图的维度(有时,但很少(。例如,我写了一个视图,模仿了Apple HealthKit的移动/锻炼/站立环的行为和外观,并对其进行了扩展,使其可以显示您想要的任意多个环,并显示最内侧环的百分比值(例如"80%"(,或者,如果您愿意,可以使用闭包在最内侧环内包含另一个子视图。有了这些,我不需要知道视图的尺寸。

它的诀窍实际上是稍微颠倒一下你的想法。尝试将配置推入视图,并使您的视图具有适应性。

你提到,结盟具有挑战性;是的,但一旦你真正掌握了窍门,它就会很强大。我推荐这个关于如何最好地利用对齐导轨的参考资料,这是一个很好的解释:https://swiftui-lab.com/alignment-guides/

但是,如果所有其他操作都失败了,并且您绝对决心使用视图的维度,请查看GeometryReader:

GeometryReader { geometry in
HStack(spacing: 0) {
Text("Left")
.font(.largeTitle)
.foregroundColor(.black)
.frame(width: geometry.size.width * 0.33)
.background(Color.yellow)
Text("Right")
.font(.largeTitle)
.foregroundColor(.black)
.frame(width: geometry.size.width * 0.67)
.background(Color.orange)
}
}
.frame(height: 50)

查看Swift破解,了解更深入的解释:https://www.hackingwithswift.com/quick-start/swiftui/how-to-provide-relative-sizes-using-geometryreader

不过要小心GeometryReader。考虑在.background().overlay()中使用它,以避免更改您的视图。第二十二条是,为了计算视图的尺寸,GeometryReader创建了一个填充所有可用空间的视图。。。这实际上会影响视图的布局。但如果你把它放在一个覆盖层中,你可以避免这个问题。使用它往往比不需要知道尺寸就知道如何进行布局要多得多。SwiftUI就是这样设计的。

最新更新