- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道 GeometryReader 是如何隐藏的,我有兴趣为学习目的构建一个自定义 GeometryReader!
坦率地说,我认为我们在 body 中使用的每个 View 都是一种 GeometryReaderView,不同之处在于它们不使用闭包来为我们发送代理,而且每个 View 都会回调它的代理会很烦人!因此apple决定给GeometryReader赋予Geometry阅读功能!所以这只是我的想法!
所以我正在寻找一种可能而且更可能是 SwiftUI 式的方法来读取 View 的代理,或者换句话说,请查看我的代码:
struct ContentView: View {
var body: some View {
CustomGeometryReaderView { proxy in
Color.red
.onAppear() {
print(proxy)
}
}
}
}
struct CustomGeometryReaderView<Content: View>: View {
@ViewBuilder let content: (CGSize) -> Content
var body: some View {
// Here I most find a way to reading the available size for CustomGeometryReaderView and reporting it back!
return Color.clear.overlay(content(CGSize(width: 100.0, height: 100.0)), alignment: .topLeading)
}
}
我还知道, View 的读取和报告代理不仅仅是 View 的大小,它还与坐标空间、框架有关……但现在为了让事情更容易解决,我只关注大小!所以大小很重要!
正如我所说,我对使用 UIKit 或 UIViewRepresentable 来读取大小不感兴趣!苹果可能会在掩护下使用类似的东西,也可能不会!我的目标是尝试使用纯 SwiftUI 解决问题,或者你们中的一些人可能有一些关于 GeometryReader 源代码的好链接以供阅读和学习。
最佳答案
好的,SwiftUI 中有多种工具可以访问 View 大小(当然 GeometryReader
除外)。
问题当然是将该尺寸值转移到 View 构建阶段,因为只有 GeometryReader
允许在同一构建周期中执行此操作。
这是使用 Shape
的可能方法的演示 - 设计的形状没有自己的大小并消耗所有可用的东西,因此覆盖所有区域,并且已提供该区域作为输入。
使用 Xcode 13/iOS 15 测试
struct CustomGeometryReaderView<Content: View>: View {
@ViewBuilder let content: (CGSize) -> Content
private struct AreaReader: Shape {
@Binding var size: CGSize
func path(in rect: CGRect) -> Path {
DispatchQueue.main.async {
size = rect.size
}
return Rectangle().path(in: rect)
}
}
@State private var size = CGSize.zero
var body: some View {
// by default shape is black so we need to clear it explicitly
AreaReader(size: $size).foregroundColor(.clear)
.overlay(Group {
if size != .zero {
content(size)
}
})
}
}
备用:相同,但使用基于回调的模式
struct CustomGeometryReaderView<Content: View>: View {
@ViewBuilder let content: (CGSize) -> Content
private struct AreaReader: Shape {
var callback: (CGSize) -> Void
func path(in rect: CGRect) -> Path {
callback(rect.size)
return Rectangle().path(in: rect)
}
}
@State private var size = CGSize.zero
var body: some View {
AreaReader { size in
if size != self.size {
DispatchQueue.main.async {
self.size = size
}
}
}
.foregroundColor(.clear)
.overlay(Group {
if size != .zero {
content(size)
}
})
}
}
关于swift - 我们如何在 SwiftUI 中制作自定义 GeometryReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69918942/
我想将 Web 应用程序转换为 iOS 应用程序,但我正在为对齐和 GeometryReader() 苦苦挣扎。 这是我原来的网络应用程序模板的截图: 这是我在 SwiftUI 中的当前版本: 使用相
我正在尝试做一些在我脑海中非常直接的事情。 我想要一个 VStack 的 subview 根据其内容动态更改其高度(下面示例中的 ProblematicView)。 它通常工作得很好,但在这种情况下,
我正在使用 GeometryReader确保图像永远不会超过屏幕宽度的一半。然而,它把我的其余观点搞乱了 GeometryReader请求 View 的完整高度/宽度(如带有绿色 BG 的图像所示)。
我有一个自定义 View : struct ImageContent: View { var body: some View { Image("smile")
你好吗? 请考虑以下代码: struct ContentView: View { var body: some View { NavigationView { G
我的布局基本上如下所示: ZStack(alignment: .bottom) { GeometryReader { geometry in ZStack {
下面的代码是创建一个自定义按钮 import SwiftUI let skyBlue = Color(red: 75/255, green: 170/255, blue: 193/255) struc
对于: struct ContentView: View { var body: some View { NavigationView {
我想知道 GeometryReader 是如何隐藏的,我有兴趣为学习目的构建一个自定义 GeometryReader! 坦率地说,我认为我们在 body 中使用的每个 View 都是一种 Geomet
我想在 VStack 之外使用 ScrollView,这样当 VStack 超出屏幕尺寸时我的内容可以滚动。现在我想在 VStack 中使用 GeometryReader,它会导致问题,我只能通过设置
我有一个固定宽度和高度的主 View ,因为这个 View 将被转换为 PDF。接下来,我有一组 subview ,它们将垂直堆叠在主 View 中。可能有更多的 subview 可以容纳在主 Vie
我正在构建一个带有卡片的网格,顶部有一个 ImageView ,底部有一些文本。这是该组件的 swift UI 代码: struct Main: View { var body: some V
是否可以使用 GeometryReader以这样的方式,它不只是填满父 View ? 作为一个具体的例子,我想使用 .padding(.bottom, geometry.safeAreaInsets.
我需要根据设备的尺寸和屏幕的宽度进行计算。 struct TranslatorView: View { @ObservedObject var settings = TranslationViewMo
我有一个标题 View ,它使用 edgesIgnoringSafeArea 将其背景扩展到状态栏下方。要正确对齐标题 View 的内容/ subview ,我需要来自 GeometryReade
我在 SwiftUI 中有一个水平 ScrollView ,我想将其“动态”居中。 ScrollView 中的内容将是一个动态图表,用户可以通过改变年份来改变它的宽度(5、10、15 年图表水平增长)
有人可以解释为什么:GeometryReader将其内容放置在左上角,而不是中心。GeometryReader占用所有可用空间。 struct ContentView: View { var
我有以下示例: import SwiftUI struct TestSO: View { @State var cards = [ Card(title: "short tit
我有一个叠加 View ,我希望它看起来紧贴其父 View 的顶部边缘(垂直对齐到顶部而不是中心,请参见快照 B)并且能够在点击时半隐藏它(将其向上移动以便它不会遮挡其父 View ,但仍有一部分可见
从今天发布的 iOS 14.0 开始,我的 iOS 代码在很大程度上依赖于 GeometryReader 进行布局,不再运行良好。即,布局是随机的。 在 Xcode 调试器中,我比较了在 iOS 13
我是一名优秀的程序员,十分优秀!