LBBottomSheet

安装

Swift Package Manager

要使用 Swift Package Manager 进行安装,请在 Xcode 中,前往 File > Add Packages...,并使用此 URL 查找 LBBottomSheet 包:https://github.com/LunabeeStudio/LBBottomSheet.git

将此 Swift Package 添加到您的项目后,您必须导入模块

import LBBottomSheet

用法

BottomSheet 使您能够以一种“模态”的形式呈现控制器,您可以为该模态选择所需的高度。

BottomSheet 的高度有 3 种不同的配置方式,由 HeightMode 枚举表示。
以下是可用的高度模式

HeightMode 描述
fitContent 底部 sheet 将调用嵌入控制器上的 preferredHeightInBottomSheet 以获取所需的高度。
free 底部 sheet 的高度将包含在 minHeightmaxHeight 之间,并且底部 sheet 将停留在用户释放它的位置。
specific 底部 sheet 将具有多个高度值。当用户释放它时,它将吸附到最近提供的特定值。呈现时,底部 sheet 将使用最小值。它可以向上滑动到最大值。您无需关心值的顺序,底部 sheet 将对其进行排序以找到匹配的值。

我们将通过以下示例了解如何配置它(请随时查看文档以查看您可以做的所有事情)。

FitContent - 示例 #1

要在当前控制器上方的底部 sheet 中显示 MyViewController,您只需从视图控制器中调用此方法

let controller: MyViewController = .init()
presentAsBottomSheet(controller)

将使用默认的 Theme 和默认的 Behavior

在此示例中,抓取器的背景是透明的。这样,您可以在滚动时看到抓取器后面的 tableView 内容,这是默认配置。让我们在下一个示例中看看如何配置它。

FitContent - 示例 #2

如果需要,您可以提供您自己的 ThemeBehavior 配置。
例如,这里我们自定义了抓取器的 backgroundswipeMode

let controller: MyViewController = .init()
let grabberBackground: BottomSheetController.Theme.Grabber.Background = .color(.tableViewBackground.withAlphaComponent(0.9), isTranslucent: true)
let grabber: BottomSheetController.Theme.Grabber = .init(background: grabberBackground)
let theme: BottomSheetController.Theme = .init(grabber: grabber)
let behavior: BottomSheetController.Behavior = .init(swipeMode: .full)
presentAsBottomSheet(controller, theme: theme, behavior: behavior)

在此示例中,背景是半透明的,并且我们将 swipeMode 设置为 .full,这意味着将从整个 BottomSheet 检测向下滑动手势(这是默认行为)。

FitContent - 示例 #3

在此示例中,抓取器的背景是不透明的,并且 swipeMode 设置为 .top,这意味着仅从抓取器区域检测向下滑动手势

let controller: MyViewController = .init()
let grabberBackground: BottomSheetController.Theme.Grabber.Background = .color(.tableViewBackground, isTranslucent: false)
let grabber: BottomSheetController.Theme.Grabber = .init(background: grabberBackground)
let theme: BottomSheetController.Theme = .init(grabber: grabber)
let behavior: BottomSheetController.Behavior = .init(swipeMode: .top)
presentAsBottomSheet(controller, theme: theme, behavior: behavior)


FitContent - 示例 #4

默认情况下,BottomSheet 会阻止您与呈现它的控制器进行交互(就像标准模态一样)。
可以在 Behavior 中使用此参数配置此行为:forwardEventsToRearController
这样,您可以继续与后面的控制器进行交互。为了获得更好的体验,我们建议您将 dimmingBackgroundColor 颜色设置为 .clear,并在呈现 BottomSheet 的控制器上实现 BottomSheetPositionDelegate,以便在需要时动态调整其底部内容插图。
这是 BottomSheet 配置代码

let controller: MyViewController = .init()
let grabberBackground: BottomSheetController.Theme.Grabber.Background = .color(.tableViewBackground, isTranslucent: false)
let grabber: BottomSheetController.Theme.Grabber = .init(background: grabberBackground)
let theme: BottomSheetController.Theme = .init(grabber: grabber, dimmingBackgroundColor: .clear)
let behavior: BottomSheetController.Behavior = .init(swipeMode: .full, forwardEventsToRearController: true)
presentAsBottomSheet(controller, theme: theme, behavior: behavior)

这是在呈现 BottomSheet 的控制器上 BottomSheetPositionDelegate 的实现

extension MainViewController: BottomSheetPositionDelegate {
    func bottomSheetPositionDidUpdate(y: CGFloat) {
        tableView.contentInset.bottom = tableView.frame.height - y
    }
}

如果您需要与之交互,这将防止您的内容被 BottomSheet 隐藏。

FitContent - 高级配置

在此模式下,默认情况下,高度是自动计算的

如果您想自定义此计算,则必须在您嵌入到 BottomSheet 中的控制器上声明此变量

@objc var preferredHeightInBottomSheet: CGFloat { /* Do your custom calculation here */ }

声明此变量后,BottomSheet 将找到并使用它来代替默认计算。

如果您在 BottomSheet 中呈现的控制器的高度在可见时可能会发生变化,您可以告知 BottomSheet 更新其高度,以便保持与嵌入式控制器需求匹配的高度。此更新由 BottomSheet 动画执行。
要告知 BottomSheet 更新其高度,您只需调用此方法

bottomSheetController?.preferredHeightInBottomSheetDidUpdate()

bottomSheetController 在任何 UIViewController 中都可用,例如 navigationControllertabBarController

此模式的最后一件事是关于动态类型。如果您在 BottomSheet 中呈现使用动态类型来管理字体大小更改(基于用户选择)的控制器,则如果字体大小在控制器呈现时发生更改,则控制器可能需要比初始高度更高的高度。
您无需管理此问题,因为 BottomSheet 正在监听内容大小类别更改通知。如果用户更改字体大小,BottomSheet 将自动触发高度更新。

如果您需要手动关闭底部 sheet,您可以通过 2 种方式执行此操作。
如果您引用了底部 sheet,则可以在其上调用此函数

dismiss(_ completion: (() -> Void)? = nil)

否则,从底部 sheet 下的任何控制器中,您可以调用

dismissBottomSheet(_ completion: (() -> Void)? = nil)

如果当前呈现的底部 sheet 是最顶层的控制器,这将关闭它。


Free height - 示例 #1

示例即将推出。


Specific heights - 示例 #1

示例即将推出。


自定义

在 BottomSheet 上,可以配置其外观和行为。
为此,您有 2 个结构体:ThemeBehavior
借助这些结构体,您可以配置如下内容

您可以在文档中找到所有可用的配置参数。

作者

Lunabee Studio 的 iOS 团队

许可证

LBBottomSheet 在 Apache 2.0 许可证下可用。有关更多信息,请参阅 LICENSE 文件。