Adding AirPlay

I’ve been meaning to look at this since 2013. Easy to get a second screen. Next, interacting with it.

References:
Understanding Windows and Screens
UIWindow
UIScreen
Presenting Content on an External Display

//  ViewController.swift

import UIKit

class ViewController: UIViewController {
    
    override func loadView() {
        let overall = UIView(frame: UIScreen.main.bounds)
        self.view = overall
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
}
//  SecondViewController.swift

import UIKit

class ViewController: UIViewController {
    
    override func loadView() {
        let overall = UIView(frame: UIScreen.main.bounds)
        self.view = overall
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
}
//  AppDelegate.swift

import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var secondWindow: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // Understanding Windows and ScreensIn rare cases you might want to create your app’s window programmatically https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html#//apple_ref/doc/uid/TP40012555-CH4-SW1
        window = UIWindow(frame: UIScreen.main.bounds)
        let myViewController = ViewController()
        window!.rootViewController = myViewController
        window!.backgroundColor = UIColor.purple
        window!.makeKeyAndVisible()
        
        setUpScreenConnectionNotificationHandlers()
        checkForExistingSecondScreen()
        
        return true
    }
    
    // Listing 2-1 Checking for the presence of an external display https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/UsingExternalDisplay/UsingExternalDisplay.html#//apple_ref/doc/uid/TP40012555-CH3-SW3
    func checkForExistingSecondScreen () {

        if (UIScreen.screens.count > 1) {
            // Get the screen object that represents the external display.
            let secondScreen = UIScreen.screens[1]
            // Get the screen's bounds so that you can create a window of the correct size.
            let secondScreenBounds = secondScreen.bounds
            
            secondWindow = UIWindow(frame: secondScreenBounds)
            secondWindow!.screen = secondScreen
            // Set up initial content to display...
            let mySecondViewController = SecondViewController()
            secondWindow!.rootViewController = mySecondViewController
            secondWindow!.backgroundColor = UIColor.lightGray
            // Show the window.
            secondWindow!.isHidden = false
        }
    }

    // Listing 2-2 Registering for screen connection and disconnection notifications https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/UsingExternalDisplay/UsingExternalDisplay.html#//apple_ref/doc/uid/TP40012555-CH3-SW6
    func setUpScreenConnectionNotificationHandlers() {
        let center = NotificationCenter.default
        center.addObserver(self, selector: #selector(handleScreenDidConnect(notification:)), name: NSNotification.Name.UIScreenDidConnect, object: nil)
        center.addObserver(self, selector: #selector(handleScreenDidDisconnect(notification:)), name: NSNotification.Name.UIScreenDidDisconnect, object: nil)
    }
    func handleScreenDidConnect(notification:NSNotification) {

        let secondScreen = notification.object as! UIScreen
        let secondScreenBounds = secondScreen.bounds
        if (secondWindow == nil) {
            secondWindow = UIWindow(frame: secondScreenBounds)
            secondWindow!.screen = secondScreen
            // Set up initial content to display...
            let mySecondViewController = SecondViewController()
            secondWindow!.rootViewController = mySecondViewController
            secondWindow!.backgroundColor = UIColor.darkGray
            // Show the window.
            secondWindow!.isHidden = false
        }
    }
    func handleScreenDidDisconnect(notification:NSNotification) {

        if (secondWindow != nil) {
            // Hide and then delete the window.
            secondWindow?.isHidden = true
            secondWindow = nil
        }
    }
}