PIPKit
- Picture in Picture for iOS (iPhone, iPad)
Requirements
- iOS 8.0+
- Swift 5.0
- Xcode 11
Installation
CocoaPods
PIPKit is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'PIPKit'
Carthage
For iOS 8+ projects with Carthage
github "Kofktu/PIPKit"
Swift Package Manager
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift
compiler. It is in early development, but Alamofire does support its use on supported platforms.
Once you have your Swift package set up, adding PIPKit
as a dependency is as easy as adding it to the dependencies
value of your Package.swift
.
dependencies: [
.package(url: "https://github.com/Kofktu/PIPKit.git", .upToNextMajor(from: "1.0.0"))
]
Usage
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()
At a Glance
Show & Dismiss
class PIPViewController: UIViewController, PIPUsable {}
let viewController = PIPViewController()
PIPKit.show(with: viewController)
PIPKit.dismiss(animated: true)
Update PIPSize
class PIPViewController: UIViewController, PIPUsable {
func updatePIPSize() {
pipSize = CGSize()
pipEdgeInsets = UIEdgeInsets()
setNeedsUpdatePIPFrame()
}
}
FullScreen <-> PIP Mode
class PIPViewController: UIViewController, PIPUsable {
func fullScreenAndPIPMode() {
if PIPKit.isPIP {
stopPIPMode()
} else {
startPIPMode()
}
}
func didChangedState(_ state: PIPState) {}
}
AVPIPKitUsable
UIView that is capable of Picture-in-Picture in iOS (AVKit.framework)
Requirements
- iOS 15 or higher
- Info.plist -
Audio, AirPlay and Picture in Picture
inBackground Modes
. For more information, see Apple Documentation
At a Glance
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()
}
}
References
- UIPiPDemo (https://github.com/uakihir0/UIPiPDemo)
Authors
Taeun Kim (kofktu), [email protected]
License
PIPKit is available under the MIT
license. See the LICENSE
file for more info.