crash - 获取 CGRect View

标签 crash swiftui cgrect

我正在使用“RectGetter”获取ViewCGRect

像这样:

Text("Hello")
    .background(RectGetter(rect: self.$rect))


struct RectGetter: View {
    @Binding var rect: CGRect

    var body: some View {
        GeometryReader { proxy in
            self.createView(proxy: proxy)
        }
    }

    func createView(proxy: GeometryProxy) -> some View {
        DispatchQueue.main.async {
            self.rect = proxy.frame(in: .global) // crash here
        }

        return Rectangle().fill(Color.clear)
    }
}

但有时我在设置矩形时会崩溃。

Thread 0 name:
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x00000001a1ec5ec4 __pthread_kill + 8
1   libsystem_pthread.dylib         0x00000001a1de5724 pthread_kill$VARIANT$armv81 + 216 (pthread.c:1458)
2   libsystem_c.dylib               0x00000001a1d358c0 __abort + 112 (abort.c:147)
3   libsystem_c.dylib               0x00000001a1d35850 abort + 112 (abort.c:118)
4   AttributeGraph                  0x00000001cce56548 0x1cce25000 + 202056
5   AttributeGraph                  0x00000001cce2b980 0x1cce25000 + 27008
6   SwiftUI                         0x00000001d89ce9b4 $s7SwiftUI27_PositionAwareLayoutContextV10dimensionsSo6CGSizeVvg + 56 (<compiler-generated>:0)
7   SwiftUI                         0x00000001d8a43584 $sSo6CGSizeVIgd_ABIegr_TRTA + 24 (<compiler-generated>:0)
8   SwiftUI                         0x00000001d8a43a54 $s7SwiftUI13GeometryProxyV4sync33_4C4BAC551E328ACCA9CD3748EDC0CC3ALLyxSgxyXElFxAA9ViewGraphCXEfU_... + 92 (GeometryReader.swift:126)
9   SwiftUI                         0x00000001d8a43f20 $s7SwiftUI13GeometryProxyV4sync33_4C4BAC551E328ACCA9CD3748EDC0CC3ALLyxSgxyXElFxAA9ViewGraphCXEfU_... + 20 (<compiler-generated>:0)
10  SwiftUI                         0x00000001d8c4842c $s7SwiftUI16ViewRendererHostPAAE06updateC5Graph4bodyqd__qd__AA0cG0CXE_tlF + 80 (ViewRendererHost.swift:64)
11  SwiftUI                         0x00000001d8a438d4 $s7SwiftUI13GeometryProxyV5frame2inSo6CGRectVAA15CoordinateSpaceO_tF + 196 (GeometryReader.swift:125)
12  MyApp                           0x0000000102cf5c54 closure #1 in RectGetter.createView(proxy:) + 128 (RectGetter.swift:22)

是否有一些更可靠的方法(不会崩溃)来获取 ViewCGRect

最佳答案

更新:改进并简化了一个可能的解决方案,通过辅助扩展读取任何坐标空间中任何 View 的矩形。从 Xcode 11.1 开始工作,用 Xcode 13.3 重新测试。

主要部分:

func rectReader(_ binding: Binding<CGRect>, _ space: CoordinateSpace = .global) -> some View {
    GeometryReader { (geometry) -> Color in
        let rect = geometry.frame(in: space)
        DispatchQueue.main.async {
            binding.wrappedValue = rect
        }
        return .clear
    }
}

用法相同

Text("Test").background(rectReader($rect))

或使用新扩展

Text("Test").reading(rect: $rect)

完成findings and code is here

关于crash - 获取 CGRect View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60214625/

相关文章:

java - 致命 :gpu_data_manager_impl_private. cc(439)] GPU 进程不可用。再见

c# - .NET 4 中的 StackOverflowException

ios - dsym 显示更多信息 --

ios - 有条件地显示列表后导航时崩溃

ios - 如何在 iOS 中与 CAShapeLayers 相交

ubuntu - NVRM : RmInitAdapter failed: Xid: 79, GPU 已经脱离总线

ios - 如何始终在 SwiftUI 中显示键盘

swiftui - 隐藏 SwiftUI DisclosureGroup 箭头并删除默认填充

ios - 计算包含 HTML 的 NSAttributedString 的高度

iOS框架改变一个属性(例如宽度)