PanelPresenter

为您的视图控制器添加滑动关闭逻辑,支持自动布局和动态高度。

image

安装

通过搜索 https://github.com/PimCoumans/PanelPresenter 将此 SPM 包添加到您的项目中。

用法

要使用 PanelPresenter 提供的行为,请确保您的视图控制器遵循 PanelPresentable 协议,并在您的初始化器中将 presenter 的 viewController 属性设置为 self。稍后执行此操作会导致奇怪的现象。

class SimpleViewController: UIViewController, PanelPresentable {
    
    let panelPresenter = PanelPresenter()
    
    init() {
        super.init(nibName: nil, bundle: nil)
        panelPresenter.viewController = self
    }
}

只需将您的视图添加到您的 view,它将被添加到 panelPresenter 的滚动视图中。任何导航类型的视图都可以放置在 headerView 中,它将显示在您的内容上方,并在滚动时固定在屏幕顶部。

private lazy var simpleView: UIView = {
    let view = UIView()
    view.backgroundColor = .systemMint
    return view
}()

private lazy var cancelButton: UIButton = {
    let button = UIButton(type: .system)
    button.setTitle("Cancel", for: .normal)
    button.addAction(UIAction { [unowned self] _ in
        self.presentingViewController?.dismiss(animated: true)
    }, for: .touchUpInside)
    return button
}()


override func viewDidLoad() {
    super.viewDidLoad()
    view.tintColor = .black
    
    view.addSubview(simpleView)
    simpleView.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        simpleView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        simpleView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        simpleView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
        simpleView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
        simpleView.heightAnchor.constraint(equalToConstant: 200),
    ])

    // Use the `panelPresentationController` property to access and configure the presentation controller
    panelPresentationController?.showsHeaderView = true
    if let headerView = panelPresentationController?.headerView {
	    headerView.addSubview(cancelButton)
        cancelButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            cancelButton.leadingAnchor.constraint(equalTo: headerView.layoutMarginsGuide.leadingAnchor),
            cancelButton.centerYAnchor.constraint(equalTo: headerView.layoutMarginsGuide.centerYAnchor)
        ])
    }
}

呈现任何视图控制器

被呈现的视图控制器不一定需要选择加入面板行为。presenter 也可以使用以下示例

let viewController = SomeViewController()
let presenter = PanelPresenter(viewController: viewController)
presenter.present(from: self, animated: true)

示例代码

查看存储库中的示例应用程序,了解将视图呈现为面板的多种支持场景,最简单的场景与上面显示的示例类似。一个更复杂的例子是 StackViewController,其中将一堆随机的、多行的标签动态添加到 UIStackView 中。每当添加或删除标签时,高度都会动态变化。在 animateChanges() 方法中,展示了如何使用 presentation controller 的同名方法来动画高度。

有问题吗?

mastodon 上找到我! ✌🏻