FitHeightSheet

Twitter: @KyawTheMonkey

fitHeightSheet 视图修饰符允许你呈现一个根据其包含的内容动态调整高度的 Sheet。当内容不需要滚动,并且你想要更紧凑和更具视觉吸引力的呈现方式时,这尤其有用。虽然 FitHeightSheet 包并非旨在取代原生的 SwiftUI Sheet,但它通过解决内容自适应高度的 Sheet 更适合的特定用例来对其进行补充。

安装

需要 iOS 14+。 FitHeightSheet 可以通过 Swift Package Manager 安装。添加包 URL

https://github.com/kyaw-codes/FitHeightSheet

教程

FitHeightSheet 包非常简单易用且功能多样!它的工作方式类似于原生的 SwiftUI Sheet,但有一些命名上的调整。

1. 基于状态的控制

就像原生 SwiftUI Sheet 一样,你可以通过 fitHeightSheet(isPresented:content:) 修饰符来显示/隐藏自适应高度 Sheet。

struct HomeView {
  @State private var showSheet = false
  
  var body: some View {
    Button("Show sheet") {
      showSheet.toggle()
    }
    // Just like sheet(isPresented:content:)
    .fitHeightSheet(isPresented: $showSheet) {
      // Your sheet here...
      Sheet()
    }
  }
}

2. 基于项的控制

就像原生 SwiftUI Sheet 一样,你可以通过 fitHeightSheet(item:content:) 修饰符来显示/隐藏自适应高度 Sheet。

struct HomeView {
  @State private var greetingText: String? = nil
  
  var body: some View {
    Button("Show sheet") {
      greetingText = "Hello 👋"
    }
    // Just like sheet(item:content:)
    .fitHeightSheet(item: $greetingText) {
      // Your sheet here...
      Sheet(greeting: greetingText)
    }
  }
}

3. 自定义选项

你可以自定义背景样式、呈现和关闭的时序曲线、顶部内容内边距以及关闭阈值。如果你想在 Sheet 关闭后执行某些操作,可以将你的逻辑写入 onDismiss 闭包中。

请注意,自定义 Sheet 上的 onAppear 修饰符可能会给你带来意想不到的结果。我建议你改用 onChange 修饰符。

struct HomeView {
  @State private var showSheet = false
  
  var body: some View {
    Button("Show sheet") {
      showSheet.toggle()
    }
    .fitHeightSheet(isPresented: $showSheet) {
      Sheet()
    }
    .onChange(of: showSheet) { isPresented in
      guard isPresented else { return }
      // Do your sheet's onAppear logic here
    }
  }
}

4. 关闭 FitHeightSheet

关闭 FitHeightSheet 就像关闭 SwiftUI Sheet 一样简单。你只需要 fitHeightSheetDismiss 环境变量,就可以像调用 SwiftUI Sheet 一样调用它。

struct Sheet {
  @Environment(\.fitHeightSheetDismiss) private var dismiss
  
  var body: some View {
    VStack {
      // Your sheet content here
      Button("Close") {
        dismiss()
      }
    }
  }
}

主要特性

FitHeightSheet 包通过提供一个精确贴合其内容的 Sheet 来增强 SwiftUI 应用程序。

1. 自适应高度

Sheet 会调整其高度以适应内容,确保无缝的用户体验。

2. 基于状态的控制

使用布尔值绑定来控制 Sheet 的呈现和关闭。

3. 基于项的控制

使用可选的项目绑定来控制 Sheet 的呈现和关闭,并将该项目传递给内容构建器。

4. 自定义

可选择背景样式、动画、内容内边距和关闭行为。

5. 关闭回调

一个可选的闭包,用于在 Sheet 关闭时执行自定义逻辑。

用例

FitHeightSheet 包非常适合需要根据其内容高度进行调整的 Sheet 的特定场景。

FitHeightSheet 包非常适合以下情况:

有关更多信息,请查看 Example 目录以发现更多额外的用例。

局限性

虽然 FitHeightSheet 是呈现内容自适应高度 Sheet 的强大工具,但在某些情况下,原生的 SwiftUI Sheet 可能更适合。

1. 非滚动内容

如果 Sheet 的内容超过可用高度,则 Sheet 将不会滚动。在这种情况下,建议使用原生的 SwiftUI Sheet。

2. 动态高度更新

当动态更新 Sheet 的内容高度(例如,展开/折叠文本)时,背景不透明度将保持固定,而不是根据拖动偏移进行调整。

3. 键盘支持

该软件包目前不支持具有键盘交互的 Sheet。如果您的 Sheet 中有输入文本字段,则在显示键盘时,背景不透明度将变为完全不透明。

在上述情况下,请使用原生的 SwiftUI Sheet。

许可证

MIT 许可证

版权所有 (c) 2024 Kyaw Zay Ya Lin Tun

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

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

本软件按“原样”提供,不提供任何形式的明示或暗示的担保,包括但不限于适销性、特定用途适用性和非侵权性的担保。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同、侵权行为或其他方面,因本软件或本软件的使用或其他处理方式而产生、导致或与之相关的。