PIPKit
- iPhone 和 iPad 上的画中画
要求
- iOS 8.0+
- Swift 5.0
- Xcode 11
安装
CocoaPods
PIPKit 通过 CocoaPods 提供使用。要安装它,仅需将以下行添加到您的 Podfile 中
pod 'PIPKit'
Carthage
对于 iOS 8+ 的项目,可以使用 Carthage
github "Kofktu/PIPKit"
Swift 包管理器
Swift 包管理器(https://swiftlang.cn/package-manager/)是一种用于自动化分发 Swift 代码的工具,并且集成到了 swift
编译器中。它目前处于早期开发阶段,但 Alamofire 支持在支持的平台上使用它。
一旦您将 Swift 包设置好,将 PIPKit
添加为依赖项就像将其添加到 Package.swift
文件中的 dependencies
值一样简单。
dependencies: [
.package(url: "https://github.com/Kofktu/PIPKit.git", .upToNextMajor(from: "1.0.0"))
]
用法
PIPUsable
public protocol PIPUsable {
var initialState: PIPState { get }
var initialPosition: PIPPosition { get }
var insetsPIPFromSafeArea: Bool { get }
var pipEdgeInsets: UIEdgeInsets { get }
var pipSize: CGSize { get }
var pipShadow: PIPShadow? { get }
var pipCorner: PIPCorner? { get }
func didChangedState(_ state: PIPState)
func didChangePosition(_ position: PIPPosition)
}
PIPKit
class PIPKit {
var isPIP: Bool
var isActive: Bool
var visibleViewController: PIPKitViewController?
class func show(with viewController: PIPKitViewController, completion: (() -> Void)? = nil)
class func dismiss(animated: Bool, completion: (() -> Void)? = nil)
}
PIPKitViewController (UIViewController & PIPUsable)
func setNeedsUpdatePIPFrame()
func startPIPMode()
func stopPIPMode()
快速浏览
显示和隐藏
class PIPViewController: UIViewController, PIPUsable {}
let viewController = PIPViewController()
PIPKit.show(with: viewController)
PIPKit.dismiss(animated: true)
更新 PIPSize
class PIPViewController: UIViewController, PIPUsable {
func updatePIPSize() {
pipSize = CGSize()
pipEdgeInsets = UIEdgeInsets()
setNeedsUpdatePIPFrame()
}
}
全屏与 PIP 模式之间切换
class PIPViewController: UIViewController, PIPUsable {
func fullScreenAndPIPMode() {
if PIPKit.isPIP {
stopPIPMode()
} else {
startPIPMode()
}
}
func didChangedState(_ state: PIPState) {}
}
AVPIPKitUsable
支持iOS中的Picture-in-Picture的UIView(AVKit.framework)
需求
- iOS 15或更高版本
- Info.plist - 在“后台模式”中添加
音频、AirPlay和Picture in Picture
。更多详细信息,请参阅Apple 文档
快速了解
var PIPKit.isAVPIPKitSupported: Bool
AVPIPKitRenderer
protocol AVPIPKitRenderer {
var policy: AVPIPKitRenderPolicy { get }
var renderPublisher: AnyPublisher<UIImage, Never> { get }
func start()
func stop()
}
AVPIPUIKitUsable
class View: UIView, AVPIPUIKitUsable {
var pipTargetView: UIView { self } // Return the subview that you want to show.
var renderPolicy: AVPIPKitRenderPolicy {
// .once - only once render
// .preferredFramesPerSecond - render in frames-per-second
}
}
view.startPictureInPicture()
view.stopPictureInPicture()
class ViewController: UIViewController, AVPIPUIKitUsable {
var pipTargetView: UIView { view } // Return the subview that you want to show.
func start() {
startPictureInPicture()
}
func stop() {
stopPictureInPicture()
}
}
参考资料
- UIPiPDemo (https://github.com/uakihir0/UIPiPDemo)
作者
Taeun Kim (kofktu), [email&protected]
许可证
PIPKit 适用于 MIT 许可证。有关更多信息,请参阅 LICENSE
文件。