Customize View Controller for Screen Mirroring in Swift for iOS
Add your own view controller to use with screen mirroring.
//// Copyright © 2017-2025 PSPDFKit GmbH. All rights reserved.//// The Nutrient sample applications are licensed with a modified BSD license.// Please see License for details. This notice may not be removed from this file.//
import PSPDFKitimport PSPDFKitUI
#if !os(visionOS)
private class MirrorablePDFViewController: PDFViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) SDK.shared.screenController.pdfControllerToMirror = self }
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) SDK.shared.screenController.pdfControllerToMirror = nil }}
class ScreenMirroringExample: Example {
override init() { super.init() title = "Screen Mirroring Customization Example" contentDescription = "Shows how to add your own view controller for screen mirroring." category = .viewCustomization priority = 10 }
override func invoke(with delegate: ExampleRunnerDelegate) -> UIViewController { let document = AssetLoader.document(for: .welcome) let pdfController = MirrorablePDFViewController(document: document) { $0.pageTransition = .scrollPerSpread }
// We do additional config in the delegate SDK.shared.screenController.delegate = self
return pdfController }}
extension ScreenMirroringExample: ScreenControllerDelegate {
internal func createPDFViewController(forMirroring screenController: ScreenController) -> PDFViewController {
let configuration = PDFConfiguration { $0.pageMode = .automatic $0.thumbnailBarMode = .none $0.documentLabelEnabled = .NO $0.isPageLabelEnabled = false
// Only per page scrolling is supported $0.pageTransition = .scrollPerSpread
$0.galleryConfiguration = GalleryConfiguration { $0.allowPlayingMultipleInstances = true $0.usesExternalPlaybackWhileExternalScreenIsActive = false }
// Set custom background for easier debugging $0.backgroundColor = UIColor.systemOrange } let pdfController = PDFViewController(document: screenController.pdfControllerToMirror?.document, configuration: configuration) return pdfController }
internal func screenController(_ screenController: ScreenController, didStartMirroringFor screen: UIScreen) { guard let pdfController = screenController.mirrorController(for: screen) else { return } var window: UIWindow? let scenes = UIApplication.shared.connectedScenes for scene in scenes { if let windowScene = scene as? UIWindowScene { window = windowScene.windows.first { window in window.rootViewController == pdfController } } } guard let window else { return }
// We change the root view controller to something else after mirroring started. let hostController = UIViewController() hostController.view.backgroundColor = UIColor.systemOrange window.rootViewController = hostController
// Re-add pdf controller and set up positioning hostController.addChild(pdfController) pdfController.view.translatesAutoresizingMaskIntoConstraints = false hostController.view.addSubview(pdfController.view) pdfController.didMove(toParent: hostController)
NSLayoutConstraint.activate([ // Thumbnail Container pdfController.view.topAnchor.constraint(equalTo: hostController.view.topAnchor, constant: 20), pdfController.view.bottomAnchor.constraint(equalTo: hostController.view.bottomAnchor, constant: -20), pdfController.view.leadingAnchor.constraint(equalTo: hostController.view.leadingAnchor, constant: 20), pdfController.view.trailingAnchor.constraint(equalTo: hostController.view.trailingAnchor, constant: -20), ]) }}
#endif
This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.