为您的视图控制器添加滑动关闭逻辑,支持自动布局和动态高度。
通过搜索 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 上找到我! ✌🏻