PBPopupController 版本 3.9.10

PBPopupController 版本 3.9.10

iDevelopper 维护。



PBPopupController 版本 3.9.10

  • iDevelopper

PBPopupController

Build Status Carthage compatible Version SwiftPM compatible Mac Catalyst compatible License Platform Swift Version

PBPopupController 是一个用于将横幅和视图控制器以弹出窗口形式呈现的框架,类似于苹果音乐应用的外观和感觉。

Image

概述

PBPopupController 允许配置一个弹出条 (如苹果音乐应用的迷你播放器),将其停靠在呈现视图容器控制器的底部栏 (如 UITabBarController、UINavigationController)。呈现视图控制器可以是任何 UIViewController 子类。

每个视图控制器都可以呈现一个附加到底部视图的弹出条。对于 UITabBarController 子类,默认为标签栏。对于 UINavigationController 子类,默认视图为工具栏。对于其他类,弹出条将在屏幕底部呈现。视图控制器子类可以提供他们自己的底部栏视图。

一旦配置了弹出条 (请参阅 PBPopupBar 类中的属性) 并提供了样式、图像、标题、副标题、按钮、效果和颜色,您就可以使用上面提供的视图控制器来呈现具有所需弹出内容视图控制器的内容 (如苹果音乐应用的完整播放器)。

一旦使用弹出内容视图控制器呈现了弹出条,用户可以在弹出条的任何位置滑动或点击以呈现内容视图控制器。完成后,用户可以通过滑动或点击系统提供的弹出关闭按钮来关闭此视图控制器。  弹出关闭按钮的样式标记为 chevron,表示现代风格的中继关闭按钮,round 表示 iOS 9 风格的关闭按钮。

您也可以以编程方式呈现和关闭弹出内容视图控制器。

弹出条有一个基于现代音乐应用外观和感觉的 prominent 样式,并且有一个基于 iOS 9 风格外观和感觉的 compact 样式。您可以更改这些默认值。

该框架提供的演示选项列在PBPopupPresentationStyle枚举中。它们使演示看起来像Apple Music应用的行为。对于iOS 9,默认的演示风格是fullScreen,而iOS 10及以下版本的风格是deck。默认风格是deck。您可以更改这些默认值。custom选项允许您在屏幕的一部分上展示控制器。

安装

Swift包管理器

PBPopupController支持5.1.0及以上的SPM版本。要使用SPM,您应该使用Xcode 11或更高版本打开您的项目。点击文件 -> Swift Packages -> 添加包依赖,输入https://github.com/iDevelopper/PBPopupController。选择您想使用的版本。

Carthage

在您的Cartfile中添加以下代码

github "iDevelopper/PBPopupController"

确保您遵循Carthage集成说明,请参见此处

手动安装

PBPopupController.xcodeproj 项拖入你的项目,并将 PBPopupController.framework 添加到项目目标的 嵌入的二进制文件 中的 通用 选项卡。Xcode 应该会自行整理其他一切内容。

CocoaPods

PBPopupController 可使用 Cocoa 依赖管理器 CocoaPods 进行安装。

将以下内容添加到您项目的 Podfile 中

pod 'PBPopupController'

要求

  • iOS 11 或更高版本。
  • ARC 内存管理。

功能

  • 对 UIViewController 类别的处理方法。
  • 处理旋转。
  • 与任何子控制器或父控制器配合良好。
  • 无缝集成点击和滑动手势识别器。
  • 用于获取控制器完整状态和实现自定义代码钩子的委托方法。
  • 用于请求自定义弹出栏标签的数据源方法。
  • 全面支持从右到左。
  • 支持可访问性。
  • 支持 iOS 13 暗黑模式。
  • 支持 macOS Catalyst。
  • 支持iPad外观和体验。

基本API描述

  • 配置和显示弹出栏
        self.tabBarController?.popupController.delegate = self
        
        if let popupBar = self.tabBarController?.popupBar {

            popupBar.dataSource = self
            
            popupBar.image = UIImage(named: "Cover01")
            popupBar.title = "Title"
            popupBar.subtitle = " A subtitle"
            popupBar.accessibilityLabel = "My custom label"
            
            let popupPlayButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "play-small"), style: .plain, target: self, action: #selector(playPauseAction(_:)))
            popupPlayButtonItem.accessibilityLabel = NSLocalizedString("Play", comment: "")
            let popupNextButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "next-small"), style: .plain, target: self, action: #selector(nextAction(_:)))
            popupNextButtonItem.accessibilityLabel = NSLocalizedString("Next track", comment: "")
            
            popupBar.rightBarButtonItems = [popupPlayButtonItem, popupNextButtonItem]
            
            let popupContentVC = self.storyboard?.instantiateViewController(withIdentifier: "PopupContentViewController") as? PopupContentViewController
            
            self.tabBarController?.presentPopupBar(withPopupContentViewController: popupContentVC, animated: true, completion: {
                print("Presented")
            })
        }
  • 程序化打开弹出内容视图控制器
        self.tabBarController?.openPopup(animated: true, completion: {
            print("Open")
        })
  • 程序化关闭弹出内容视图控制器
        self.tabBarController?.closePopup(animated: true, completion: {
            print("Closed")
        })
  • 用于获取控制器状态的自定义方法
    func popupController(_ popupController: PBPopupController, stateChanged state: PBPopupPresentationState, previousState: PBPopupPresentationState) {
        PBLog("stateChanged state: \(state.description) - previousState: \(previousState.description)")
    }
    func popupController(_ popupController: PBPopupController, didOpen popupContentViewController: UIViewController) {
        PBLog("didOpen - state: \(popupController.popupPresentationState.description)")
    }

等等...

  • PBPopupBar的数据源方法,提供标签实例(例如MarqueeLabel)
    lazy var label: MarqueeLabel = {
        let marqueeLabel = MarqueeLabel(frame: .zero, rate: 15, fadeLength: 10)
        marqueeLabel.leadingBuffer = 0.0
        marqueeLabel.trailingBuffer = 5.0
        marqueeLabel.animationDelay = 1.0
        marqueeLabel.type = .continuous
        return marqueeLabel
    }()

...

    func titleLabel(for popupBar: PBPopupBar) -> UILabel? {
        return self.label
    }
    func subtitleLabel(for popupBar: PBPopupBar) -> UILabel? {
        return self.sublabel
    }

管理状态栏

自iOS 13以来,苹果没有正确地动画化状态栏。因此,您可以为弹出内容视图控制器设置属性

popupPreferredStatusBarStyle以及为容器视图控制器设置首选状态栏样式的containerPreferredStatusBarStyle

当您在扩展的弹出内容视图控制器中覆盖preferredStatusBarStyle变量时,返回container.popupController.popupStatusBarStyle

    override public var preferredStatusBarStyle: UIStatusBarStyle {
        guard let containerVC = self.popupContainerViewController else {return.default}
        guard let popupContentView = containerVC.popupContentView else {return .default}
    
        if popupContentView.popupPresentationStyle != .deck {
            return .default
        }
        return containerVC.popupController.popupStatusBarStyle
    }

API文档

您可以在这里找到文档。文档由jazzy生成,并托管在GitHub-Pages上。

特别鸣谢

特别感谢Leo Natan

此代码是从他的优秀框架LNPopupController中受到启发的。

作者

Patrick BODET,又名iDevelopper

许可协议

PBPopupController 在 MIT 许可协议下可用,更多详细信息请查看 LICENSE 文件

请告诉我您在使用此控制器时的项目情况!

祝好,

Patrick Bodet,又名 iDevelopper