获取视图的CGRect

2023-12-01

我正在使用“RectGetter”来获取CGRect of a View.

像这样:

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)

是否有一些更可靠的方法(不崩溃)来获取CGRect of a 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)

完全的结果和代码在这里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取视图的CGRect 的相关文章

随机推荐

  • 使用面向对象编程将值插入数据库[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用已弃用的 mysql 函数成功重写旧的 mysql php 代码 我无法将这些值插入数据库 但是我也没有收到任何错误消息
  • 目标设置为 iOS 13 的 iOS 应用程序不会在 App Store 上提供旧版本

    I have a new app that I released for App Store that has min target set to iOS 13 In App Store Connect under Pricing and
  • PHP 创建的 Excel 工作表在打开时出现错误

    所以 我当前的代码可以 100 运行 文件已创建并在 Excel 中打开 但打开后 会出现一些错误 必须单击才能打开该文件 它们如下 address book xls 的文件格式和扩展名不匹配 该文件可能已损坏或不安全 除非您信任其来源 否
  • 如何对每 n 个数组值求和并将结果放入新数组中? [复制]

    这个问题在这里已经有答案了 我有一个很长的数组数字列表 我想将其求和并放入一个新数组中 例如数组 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 会成为 6 15 16 6 15 x 如果我要每 3 求和 我不知道该怎么做
  • 带有部分页面的客户端的 Outputcache 属性

    我创建应用程序菜单的部分页面 我正在使用 renderaction 调用菜单部分视图 我想通过这样做将这部分页面存储在客户端 OutputCache Duration 7200 Location OutputCacheLocation Cl
  • 如何更新 SWT 组合框中的项目列表?

    我有一个带有组合框的用户界面 每次组合要打开列表时 都必须刷新可以选择的项目列表 有没有什么方法 即添加一个侦听器来通知 UI Combo 即将打开 不幸的是 我无法观察模型在更改时更新列表 不幸的是 SWT 组件没有这样的方法 在 Swi
  • 理解 C 中变长数组的困难

    我正在读一本书 发现数组大小必须在声明时给出 或者在运行时使用 malloc 从堆中分配 我用 C 编写了这个程序 include
  • ajax通过jquery提交多个表单

    所以假设我有 3 种形式
  • Databricks - 如何将驱动程序日志复制到我的计算机?

    我可以在 databricks 驱动程序节点上使用 sh 命令查看日志 如何将它们复制到我的 Windows 计算机上进行分析 sh cd 事件日志 4246832951093966440 gunzip eventlog 2019 07 2
  • Java中内存地址存放在哪里

    Java中内存地址存放在哪里 我想了解的是如何存储类似以下内容的内容 我已经知道堆栈和堆之间的区别 但试图更深层次地挖掘 int i 5 Is i单独存放和5单独存储 然后建立映射 同样 我们说对于 32 位版本 最多可以有 4 GB RA
  • Java 并发:CAS 与锁定 [已关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我正在看书Java 并发实践 在第 15 章中 他们讨论了非阻塞算法和比较和交换 CAS 方法 据记载 CAS 的性能比锁定方法好得多 我想问那些已经使用过这两个概念并想听听您何时更喜欢其
  • 包含空格和特殊字符的 URL 的最佳实践

    我目前正在修改一个小型网络应用程序 该网络应用程序允许用户自己输入 指定类别 我注意到在数据库中 有很多类别包含空格和特殊字符 例如蛋糕和纸杯蛋糕 在前端 数据库以 URL 链接的形式显示所有用户定义的类别 用户可以单击它们来进一步查看该类
  • 创建钛模块时出现构建错误

    我创建了一个新的移动模块项目 但是当我尝试构建它时 出现以下错误 构建失败 C ProgramData Titanium mobilesdk win32 5 2 2 GA module android build xml 165 没有指定可
  • 在 Windows 上使用 -R 和 -rpath 开关进行链接

    我在 Windows XP 上使用 gcc 编译器 MinGW 我创建了一个 dll 库libdir dll比我尝试构建一个使用该库的程序 我不想将该 dll 文件放入 System 或 System32 文件夹中 也不想在 PATH 变量
  • 为对象定义索引器

    一个人可以制造一个物体iterable通过实施 Symbol iterator 但是我们如何才能推翻 的行为呢 操作员 例如 我有一个对象 里面有一个数组 我希望能够访问给定的索引 例如obj 3 那可能吗 example const Si
  • 从 tkinter 中的树视图获取数据

    我正在尝试从填充的 Treeview 中获取数据 self tree show headings self tree columns Pool ID Time Lat Lon Alt Spd hdop vdop pdop Sats Used
  • 为什么wcf客户端连接服务这么慢?

    我在使用WCF服务时遇到了性能问题 故事是这样的 我编写了一个自托管的 WCF 服务 该服务由控制台应用程序托管 我编写了一个简单的客户端来使用该服务 WCF服务运行后 客户端需要15秒以上的时间才能与服务建立连接 WCF 服务非常简单 就
  • 使用 group by 空指针从 sqlite 获取值

    我有一个表 其中有一些重复的记录 现在我正在获取记录而不排除重复的记录 我想获取不包括重复项的所有记录 并且从重复数据中我只想要一条记录 就像如果我有三个相同的记录我只想要一个记录 我的查询是这样的 这给出了空指针 Cursor dCurs
  • Pyspark:更改嵌套列数据类型

    我们如何更改 Pyspark 中嵌套列的数据类型 例如 如何将 value 的数据类型从 string 更改为 int 参考 如何在pyspark中将Dataframe列从String类型更改为Double类型 x 12 y p name
  • 获取视图的CGRect

    我正在使用 RectGetter 来获取CGRect of a View 像这样 Text Hello background RectGetter rect self rect struct RectGetter View Binding