20

我的应用程序使用带有一些填充的 GeometryReader 在 NavigationView 内设置视图框架尺寸。

从 iOS 14 开始,我收到以下错误消息:

无效的框架尺寸(负或非有限)

这是一些要测试的示例代码:

import SwiftUI

struct ContentView: View {

    let padding:CGFloat = 16.0

    var body: some View {
        NavigationView {
            GeometryReader { p in
        Text("Hello, world!")
            .frame(width: p.size.width - padding)
            .padding()
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

删除 NavigationView 可以解决问题,但我需要 NavigationView 中容器视图的当前宽度和高度。

有什么建议吗?

4

7 回答 7

14

我认为这可能是一个静态分析问题,.frame(width: p.size.width - padding)可能会导致负值。尝试:

.frame(width: abs(p.size.width - padding))
于 2020-09-27T11:30:14.723 回答
2

这对我有帮助:

我在正文中的第一个元素(它是一个带有 .frame 的 VStack)周围添加了一个 Group { }。该小组没有“.frame”等。在我的 MacOS 应用程序上工作以摆脱这个愚蠢的问题。

或者你可以添加类似的东西

.frame(minWidth: 300, idealWidth: 400, maxWidth: 600, minHeight: 300, idealHeight: 400, maxHeight: 500, alignment: .top)

到您的 VStack(或其他)以清楚地说明您想要的尺寸。

编辑 奇怪这个错误会再次出现,但不会立即出现......

于 2021-03-12T09:31:35.527 回答
2

用macOS 11.1测试时发现GeometryReader不能在view init开始时立即返回实际大小,第一次得到的大小不正确,可能需要做一个dispatch async操作来避免这个警告

警告:无效的框架尺寸(负数或非有限)

于 2020-12-17T11:02:45.610 回答
1

我遇到了同样的问题。我没有深入了解为什么在 a 中NavigationView会导致这种情况,但一种解决方法是将整个包裹NavigationView在 a 中GeometryReader并将其传递GeometryProxy到树下。

于 2021-01-08T18:01:50.733 回答
0

试试这个,对我有用~

.frame(width:abs(GeometryReader_width)))
于 2021-12-15T16:01:13.573 回答
0

您不能对帧参数使用负值。如果你使用 .infinity 或负值作为 frame,用 nil 改变它:

错误的:

.frame(width: visible ? .infinity : 0,
                           height: visible ? .infinity : 0,
                           alignment: .bottomTrailing)

正确的:

.frame(width: visible ? nil : 0,
                           height: visible ? nil : 0,
                           alignment: .bottomTrailing)
于 2022-01-06T13:40:45.250 回答
0

正如 Patric Fu 所说,这通常是一个初始化问题,会生成警告消息“帧尺寸无效(负数或非有限)”。

就我而言,此警告是在以下语句中生成的

.frame(width: frameSide, height: frameSide)

当使用以下语句生成 frameSide

let frameSide = min(innerRectangle.width, innerRectangle.height)

更改上述语句以提供如下默认值

let frameSide = innerRectangle.width.isNaN ? 0 : min(innerRectangle.width, innerRectangle.height)

解决了这个问题并且没有生成警告。

当然,三元运算符中的条件会根据变量“frameSide”的构造而有所不同。我发现这是一种比使用“调度异步操作”更简单的方法。如果将此答案作为对 Patric Fu 原始答案的评论附加,则更有可能有所帮助。但是,我没有足够的声誉发表评论。

于 2022-01-21T08:20:03.733 回答