Skip to content

JmoVxia/CLPlayer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

dac33e7 · Feb 16, 2025
Dec 15, 2021
Nov 10, 2023
May 17, 2024
Feb 16, 2025
May 17, 2024
Dec 15, 2021
Feb 16, 2025
Dec 15, 2021
Feb 16, 2025
Nov 10, 2023
Dec 15, 2021
Nov 10, 2023
Nov 10, 2023
Feb 16, 2025
Nov 16, 2023
Dec 15, 2021
Feb 16, 2025
Jan 17, 2017
May 17, 2024
Feb 16, 2025
May 17, 2024

Repository files navigation

前言

    很早之前开源了一个简单的视频播放器,由于年久失修,效果惨目忍睹,最近特意花时间对其进行了深度重构。旧版本后期不再维护,新版本使用Swift实现,后续会增加更多功能。不想看文字的请自行下载代码------>>>CLPlayer

旧版本 VS 重构版本

1.新版本使用Swift,旧版本使用Objective-C

2.新版本采用自定义转场实现全屏,旧版本使用旋转屏幕

3.新版本不需要手动销毁播放器

4.新版本修复了老版本遗留bug

5.新版本降低了代码耦合性

6.新版本增加了倍数播放,切换填充模式

7.新版本提供更丰富的API

8.新版本适配了iPhone X

9.新版本移除了状态栏相关配置

效果

效果图

全屏

控制面板

UITableView

UICollectionView

功能

  • 支持Autolayout、UIStackView、Frame
  • 支持全屏模式、小屏模式
  • 支持跟随手机自动旋转
  • 支持本地视频、网络URL
  • 支持UITableView
  • 支持UICollectionView
  • 支持手势改变屏幕的亮度(屏幕左半边)
  • 支持手势改变音量大小(屏幕右半边)
  • 支持拖动UISlider快进快退
  • 支持iPhone X留海屏
  • 支持倍速播放(0.5X、1.0X、1.25X、1.5X、1.75X、2X
  • 支持动态改变播放器的填充模式(适应、拉伸、填充
  • 支持cocoapods

接入指南

项目必须支持全屏,建议将屏幕支持方向交由当前显示的控制器自行管理。

项目支持全屏方案

1.先勾选支持方向,只保留portrait,保证APP启动不会横屏

image.png

2.AppDelegate中重写func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {}方法

func application(_: UIApplication, supportedInterfaceOrientationsFor _: UIWindow?) -> UIInterfaceOrientationMask {
        return .allButUpsideDown
}

3.在父类中重写屏幕控制相关方法

// 是否支持自动转屏
override var shouldAutorotate: Bool {
    guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.shouldAutorotate ?? false }
    return navigationController.topViewController?.shouldAutorotate ?? false
}

// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.supportedInterfaceOrientations ?? .portrait }
    return navigationController.topViewController?.supportedInterfaceOrientations ?? .portrait
}

// 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.preferredInterfaceOrientationForPresentation ?? .portrait }
    return navigationController.topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}

UINavigationController

// 是否支持自动转屏
override var shouldAutorotate: Bool {
    return topViewController?.shouldAutorotate ?? false
}

// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return topViewController?.supportedInterfaceOrientations ?? .portrait
}

// 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}

UIViewController

// 是否支持自动转屏
override var shouldAutorotate: Bool {
    return false
}

// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

// 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return .portrait
}

4.部分页面需要支持多方向

在对应控制器中重写以下方法

override var shouldAutorotate: Bool {
    return true
}

// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .allButUpsideDown
}

基础配置

public struct CLPlayerConfigure {
    /// 顶部工具条隐藏风格
    public enum CLPlayerTopBarHiddenStyle {
        /// 小屏和全屏都不隐藏
        case never
        /// 小屏和全屏都隐藏
        case always
        /// 小屏隐藏,全屏不隐藏
        case onlySmall
    }

    /// 自动旋转
    public var isAutoRotate = true
    /// 手势控制
    public var isGestureInteractionEnabled = true
    /// 是否显示更多面板
    public var isShowMorePanel = true
    /// 顶部工具条隐藏风格
    public var topBarHiddenStyle: CLPlayerTopBarHiddenStyle = .onlySmall
    /// 工具条自动消失时间
    public var autoFadeOut: TimeInterval = 5
    /// 默认拉伸方式
    public var videoGravity: AVLayerVideoGravity = .resizeAspectFill
    /// 顶部工具条背景颜色
    public var topToobarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
    /// 底部工具条背景颜色
    public var bottomToolbarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
    /// 进度条背景颜色
    public var progressBackgroundColor: UIColor = .white.withAlphaComponent(0.35)
    /// 缓冲条缓冲进度颜色
    public var progressBufferColor: UIColor = .white.withAlphaComponent(0.5)
    /// 进度条播放完成颜色
    public var progressFinishedColor: UIColor = .white
    /// 转子背景颜色
    public var loadingBackgroundColor: UIColor = .white
    /// 返回按钮图片
    public var backImage: UIImage?
    /// 更多按钮图片
    public var moreImage: UIImage?
    /// 播放按钮图片
    public var playImage: UIImage?
    /// 暂停按钮图片
    public var pauseImage: UIImage?
    /// 进度滑块图片
    public var sliderImage: UIImage?
    /// 最大化按钮图片
    public var maxImage: UIImage?
    /// 最小化按钮图片
    public var minImage: UIImage?
    /// 封面图片
    public var maskImage: UIImage?
}

总结

    本次重构为Swift第一版,后续会持续更新,定制化开发请自行参考CLPlayer修改 , 如果喜欢,欢迎star。

参考资料

  1. iOS播放器全屏方案

  2. iOS状态栏

  3. iOS播放器全屏旋转实现

  4. iOS横竖屏旋转解决方案 - Swift

  5. iOS视频旋转探究

  6. iOS屏幕旋转的解决方案