以下代码运行正常,正如预期的那样,直到我Text
在下面添加了额外的视图Toggle
(在下面的代码中已注释掉)。当我这样做时,我得到了一个Geometry action is cycling between duplicate values.错误,程序最终挂起(在 X86 15.2 上)。它并没有真正挂起,但似乎卡在了某个无限更新循环中,消耗了 100% 的核心并耗尽了 RAM。M3 15.1 上出现了同样的错误,只是还没有能够让它挂起/卡住。
这似乎是一个新的错误,因为 Google 没有返回任何结果。
有人见过类似的事情吗?如果是,这意味着什么?
代码有问题吗?或者这是 SwiftUI 中可能存在错误的征兆?
struct CaptureSizeView: ViewModifier {
@Binding var size: CGSize
func body(content: Self.Content) -> some View {
content
.onGeometryChange(for: CGSize.self) { proxy in proxy.size }
action: { newValue in size = newValue }
}
}
public extension View {
func captureSize(_ size: Binding<CGSize>) -> some View {
modifier(CaptureSizeView(size: size))
}
}
public extension CGSize {
var aspectRatio: CGFloat { self.width / self.height }
}
struct ContentView: View {
@State private var clearSize: CGSize = .zero
@State private var isSquare: Bool = false
var body: some View {
HStack(alignment: .top) {
VStack(alignment: .leading) {
Toggle("Keep Square", isOn: $isSquare).toggleStyle(.switch)
// Uncomment: error "Geometry action is cycling between duplicate values."
// Text("available size: \(clearSize)")
}
.padding()
Divider()
VStack {
Text("Canvas")
.font(.largeTitle)
.fontWeight(.black)
Text("available size: \(clearSize)")
ZStack {
Color.clear
.border(.green)
.captureSize($clearSize)
.overlay {
Canvas { _, _ in
}
.aspectRatio(isSquare ? 1 : clearSize.aspectRatio, contentMode: .fit)
.background(.yellow)
}
}
.padding()
}
}
}
}