EasyGeometryProxy

一个 SwiftUI 包,可以轻松访问视图的大小和内边距信息。
让你的代码摆脱丑陋的 GeometryReader。

Swift Version Platforms
Reddit Threads MIT License

import SwiftUI
import EasyGeometryProxy

struct ContentView: View {

    var body: some View {
        NavigationView {
            // ...
        }
        .withViewSize(onAppear: someFunction)
    }
}

概述

EasyGeometryProxy 是 SwiftUI 的 View 类型的 Swift 扩展。它提供了一个更简洁的替代方案,替代了在视图背景上使用传统 GeometryReader 的方式,提供了一种优雅而直接的方法来访问视图的大小和安全区域内边距。

API

三个便捷函数

所有函数都经过重载,以支持各种参数组合,允许你在需要时访问所需的数据。所有 onChange 变体都可以按如下方式调整

EasyGeometryProxy 利用了 iOS 17 的新 onChange(of:initial:_:) 函数。

用法

使用视图的大小从未如此简洁。

示例

1. 在显示时访问安全区域内边距

之前:

.background {
    GeometryReader { proxy in
        Color.clear
            .onAppear {
                setBottomSafeArea(proxy.safeAreaInsets)
            }
    }
}

之后:

.withViewInsets(onAppear: setBottomSafeArea)

2. 在显示和更改时访问大小和内边距

之前:

.background {
    GeometryReader { proxy in
        Color.clear
            .onAppear {
                someFunction(proxy)
            }
        .onChange(of: proxy.size, perform: someFunction)
        .onChange(of: proxy.safeAreaInsets, perform: someFunction)
    }
}

之后:

.withViewGeometryProxy(
    onAppear: someFunction,
    onChangeSize: someFunction,
    onChangeInsets: someFunction
)

3. 演示使用 0 个或 2 个参数的重载

显式

.withViewGeometryProxy { proxy in
    someFunction(proxy)
} onChangeSize: {
    /* 0 parameters */ 
    someFunction()
} onChangeInsets: { oldInsets, newInsets in
    /* 2 parameters */
    someFunction(oldInsets, newInsets)
}

隐式

.withViewGeometryProxy(
    onAppear: someFunction,
    onChangeSize: someFunction,  // 0 parameters
    onChangeInsets: someFunction // 2 parameters
)

安装

  1. 要在 Xcode 中使用 EasyGeometryProxy,请导航至:File ➡ Add Package Dependencies

  2. 在右上角的搜索栏中,输入:https://github.com/DevonMartin/EasyGeometryProxy

  3. 确保您的项目已在下拉菜单 Add to Project 中选中,然后单击 Add Package

就这样!然后,在任何要访问该包的文件中,只需 import EasyGeometryProxy

许可证

MIT 许可证(MIT)

版权所有 © 2023 Devon Martin

特此授予任何人为获得本软件及相关文档文件(“软件”)的副本的任何人员免费许可,以处理本软件而无限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件的副本的权利,并允许向其提供本软件的人员,但须符合以下条件

以上版权声明和本许可声明应包含在本软件的所有副本或重要部分中。

本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、适用于特定目的和不侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为或其他方面,由本软件或本软件的使用或其他交易引起的、与之相关的或与之相关的。