【发布时间】:2021-02-09 02:22:29
【问题描述】:
问题
我收到一个线程问题,显示“帧尺寸无效(负数或非有限)。”
这是我的代码:
struct CellStyle: ViewModifier {
func body(content: Content) -> 一些视图 {
内容
.frame(宽度:.infinity,高度:56,对齐方式:.center)
.padding(.horizontal, 16)
}
}
代码运行良好,我似乎在做它应该做的事情,所以我很困惑为什么它会给我线程问题。为什么代码会在没有有限宽度/高度的情况下运行,这与 Apple 文档相矛盾? (请参阅下面的“一些阅读”部分)
修复
这段代码很好地解决了这个问题,但我仍然希望我能理解为什么前面的代码不会崩溃或产生错误。
struct CellStyle: ViewModifier {
func body(content: Content) -> 一些视图 {
内容
.frame(高度:56,对齐方式:.center)
.frame(最大宽度:.infinity)
.padding(.horizontal, 16)
}
}
据我所知,它给了我线程问题,因为我告诉.frame,我想要一个不是有限的宽度,它想要一个有限的宽度。
关于堆栈溢出的其他问题
我发现了两个问同样问题的问题:
iOS 14 Invalid frame dimension (negative or non-finite)
SwiftUI iOS14 GeometryReader Invalid frame dimension
在第一个问题中,线程问题是有道理的,因为给定代码.frame(width: p.size.width - padding),不能保证p.size.width 会小于padding。据我所知,这是一个给定值可能为负的问题。
我遇到的这个问题与给定值不是有限的有关,所以这些问题不相关。
第二个问题还没有回答,有点含糊,所以现在对我没有多大帮助。也许以后有人会给出一个有用的答案,但到目前为止,它还没有帮助。
一些阅读
看着Apple docs我发现了这个:
使用此方法为视图的宽度、高度或两者指定固定大小。如果您只指定其中一个维度,则生成的视图会假定此视图在另一个维度中的大小调整行为。
那么为什么.frame(width: .infinity, height: 56, alignment: .center) 甚至会运行呢?
Apple 所说的“结果视图假定此视图在另一个维度上的大小调整行为”是什么意思?它是否总是假定该视图是“推出”视图,从而给出与 .infinity 相同的结果?
我对此进行了测试并运行了以下代码:
struct CellStyle: ViewModifier {
func body(content: Content) -> 一些视图 {
内容
.frame(高度:56,对齐方式:.center)
.padding(.horizontal, 16)
}
}
它似乎给出了相同的结果,所以现在我很好奇是否存在快速“假设”宽度会导致 .infinity 以外的行为的情况?
最后一个问题
.frame(width: .infinity) 与 .frame(width: nil) 之间的行为差异是什么(相当于发射宽度或高度)。
func frame(width: CGFloat? = nil, height: CGFloat? = nil, alignment: Alignment = .center) -> 一些视图
感谢您的帮助!
【问题讨论】: