前语

    很早之前开源了一个简略的视频播映器,因为年久失修,作用惨目忍睹,最近特意花时刻对其进行了深度重构。旧版别后期不再维护,新版别运用Swift完结,后续会添加更多功能。不想看文字的请自行下载代码——>>>CLPlayer

旧版别 VS 重构版别

1.新版别运用Swift,旧版别运用Objective-C

2.新版别采用自定义转场完结全屏,旧版别运用旋转屏幕

3.新版别不需要手动毁掉播映器

4.新版别修正了老版别留传bug

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

6.新版别添加了倍数播映,切换填充形式

7.新版别供给更丰富的API

8.新版别适配了iPhone X

9.新版别移除了状态栏相关装备

作用

使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本

使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本

使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本

使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本

使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本

功能

  • 支撑全屏形式、小屏形式
  • 支撑跟随手机主动旋转
  • 支撑本地视频、网络URL
  • 支撑UITableView
  • 支撑UICollectionView
  • 支撑手势改动屏幕的亮度(屏幕左半边)
  • 支撑手势改动音量大小(屏幕右半边)
  • 支撑拖动UISlider快进快退
  • 支撑iPhone X留海屏
  • 支撑倍速播映(0.5X、1.0X、1.25X、1.5X、1.75X、2X
  • 支撑动态改动播映器的填充形式(习惯、拉伸、填充
  • 支撑cocoapods

接入攻略

项目有必要支撑全屏,建议将屏幕支撑方向交由当时显示的操控器自行管理。

项目支撑全屏方案

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

使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本

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

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

3.在父类中重写屏幕操控相关办法

UITabBarController

// 是否支撑主动转屏
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屏幕旋转的解决方案