Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Airplay: Mirror subview on external window

a design / architectural question on airplay. I have setup an external display in the AppDelegate:

UIScreen *externalScreen = UIScreen.screens.lastObject;
self.externalWindow = [[UIWindow alloc] initWithFrame:externalScreenFrame];
self.externalWindow.screen = externalScreen;
self.externalWindow.backgroundColor = [UIColor redColor];

Works fine, TV shows an empty screen in red. Now I have a ViewController with a bunch of subviews, and one view should be shown on the device and the external screen. If I try this in ViewController.m:

[_appDelegate.externalWindow addSubview:self.deviceAndTVView];

deviceAndTVView will only show on the external screen, not on the device anymore. What I would need is to have deviceAndTVView on the device, updating itself on touches / user interaction, and mirror those updates on the external screen.

Which is the right path to accomplish that?

Thanks for reading! m

like image 781
marimba Avatar asked Apr 08 '12 10:04

marimba


1 Answers

The technology called AirPlay mirroring is poorly named. It actually operates in two modes, one where the entire iOS device is mirrored to the AirPlay device, and in another mode where once the mirroring AirPlay device is connected, the developer has two UIWindow/UIScreen's to work with.

You are using the latter mode, which is often referred to as "mirroring", but really you have a completely separate window/screen to manage and there should be better terminology to refer to this mode of operation.

What you describe doing above is basically moving a UIView from the device window to the AirPlay window, and it's working exactly as it should!

There is no technical way for you to have a single instance of a UIView show on both of these windows - it will exist in one UIView hierarchy or the other, but not both at the same time. In other words, if you want the same thing to show on both screens, you need to create two instances of the same UIView, and add them respectively to the two windows, and then update both of them as they change.

While this may not be the super-convienent "mirroring" you were expecting, it's probably be a good thing because your UIView may have different aspect ratio on the device than it does on the AirPlay device. By having two different views, showing the same content, you can adjust the sizing of the AirPlay view to best use of the available resolution of the device.

like image 184
Rob Reuss Avatar answered Sep 23 '22 15:09

Rob Reuss