当前位置: 首页 > 面试题库 >

SwiftUI中的Geometry Reader是什么?

吉玉宸
2023-03-14
问题内容

我正在学习SwiftUI。我遇到了“ GeometryReader”。我想知道为什么以及何时使用它?


问题答案:

更新

自从发布答案以来,我还写了一篇有关GeometryReader如何工作的文章。
查看它以获取更详细的说明:https :
//swiftui-lab.com/geometryreader-to-the-rescue/

GeometryReader是一个视图,使您可以访问父级的大小和位置。例如:

struct MyView: View {
    var body: some View {
        GeometryReader { geometry in
           // Here goes your view content,
           // and you can use the geometry variable
           // which contains geometry.size of the parent
           // You also have function to get the bounds
           // of the parent: geometry.frame(in: .global)
        }
    }
}

我通常将其与.background()结合使用以获得其他视图的范围。例如,“文本”视图很难预先预测它的大小。当我需要这些信息时,可以使用以下技巧:

首先,我定义了一个名为GeometryGetter的视图:

struct GeometryGetter: View {
    @Binding var rect: CGRect

    var body: some View {
        return GeometryReader { geometry in
            self.makeView(geometry: geometry)
        }
    }

    func makeView(geometry: GeometryProxy) -> some View {
        DispatchQueue.main.async {
            self.rect = geometry.frame(in: .global)
        }

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

然后,获取Text视图(或任何其他视图)的边界:

struct MyView: View {
    @State private var rect: CGRect = CGRect()

    var body: some View {
        Text("some text").background(GeometryGetter($rect))

        // You can then use rect in other places of your view:
        Rectangle().frame(width: 100, height: rect.height)
    }
}

注意

在GeometryGetter中,我添加了DispatchQueue.main.async {}来设置矩形。在某些情况下,否则可能会导致运行时警告:
在视图更新期间修改状态



 类似资料:
  • SwiftUI教程使用关键字指示可变UI状态: 它提供了以下总结: 状态是一个值或一组值,可以随时间变化,并影响视图的行为、内容或布局。使用具有@State属性的属性将状态添加到视图。 这个关键词到底是什么意思? 如何改变一个变量导致视图被重新计算? 其他变量如何在getter中不可变?

  • 苹果新的框架似乎使用了一种新的语法,可以有效地构建元组,但有另一种语法: 试图解决这个语法到底是什么,我发现这里使用的初始化器需要类型

  • 请问:SwiftUI的动态替换是什么意思? 动态替换。Swift 编译器和运行时已全面嵌入到 Xcode 中,你可以随时构建和运行你的 App。你看到的设计画布不仅看起来像是用户界面 — 它确实就是你实时运行的 App。此外,使用动态替换功能,Xcode 可以直接在实时运行的 App 中替换成编辑后的代码。

  • 问题内容: 苹果的新框架似乎使用了一种 新型语法 ,可以有效地构建元组,但又具有另一种语法: 尝试解决这种语法的实际含义时 ,我发现这里使用的初始化程序将类型的闭包 作为第二个参数,其中的通用参数是通过闭包推断的。为了找出要推断的类型,我对代码进行了一些更改,并保持其功能: 以此,表明自己是类型,即类型。向上看,我发现它是一个源自自身的包装器类型,只能通过传递应该包装的元组来进行初始化。 题 现在

  • 协议定义如下: 因此,现在是一个过时的协议,不能直接用作返回类型,尽管swift5.1的不透明返回类型可以处理这个问题,但是为什么要声明一个,而不是?

  • 问题内容: 该SwiftUI教程使用关键字来表示可变UI状态: 它提供了以下摘要: 状态是一个值或一组值,可以随时间变化,并影响视图的行为,内容或布局。您可以将属性与@State属性一起使用,以将状态添加到视图中。 关键字的确切含义是什么? 变异变量如何导致视图重新计算? 其他变量在吸气剂中如何不变? 问题答案: 该关键字是,最近刚刚在雨燕5.1中引入的功能。如相应提案中所述,它有点像是值包装器,