Mirror ViewController a la pantalla externa

Estoy tratando de codificar, get mi vista en la aplicación iPad para reflejar en una pantalla externa. En AppDelegate didFinishLaunching, tengo:

if ([[UIScreen screens] count] > 1) { UIScreen *secondScreen = [[UIScreen screens] objectAtIndex:1]; NSString *availableModeString; for (int i = 0; i < secondScreen.availableModes.count; i++) { availableModeString = [NSString stringWithFormat:@"%f, %f", ((UIScreenMode *)[secondScreen.availableModes objectAtIndex:i]).size.width, ((UIScreenMode *)[secondScreen.availableModes objectAtIndex:i]).size.height]; [[[UIAlertView alloc] initWithTitle:@"Available Mode" message:availableModeString delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; availableModeString = nil; } // undocumented value 3 means no overscan compensation secondScreen.overscanCompensation = 3; self.secondWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 1280, 720)]; self.secondWindow.backgroundColor = [UIColor blueColor]; self.secondWindow.screen = secondScreen; ViewController *viewController = [[ViewController alloc] init]; self.secondWindow.rootViewController = viewController; self.secondWindow.hidden = NO; } 

Todo lo que aparece en la pantalla externa es el color de background azul establecido en el código.

Puedo reflejar una vista en mi iPhone 6 usando esto:

 @interface MirrorViewController () @property (nonatomic, retain) UIView *viewToMirror; @property (nonatomic, retain) UIView *snapshotView; @end @implementation MirrorViewController - (instancetype)initWithViewToMirror:(UIView*)view { self = [super initWithNibName:nil bundle:nil]; if (self == nil) return nil; self.viewToMirror = view; return self; } - (void)viewDidLoad { CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)]; [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; } - (void)update { [self.snapshotView removeFromSuperview]; self.snapshotView = [self.viewToMirror snapshotViewAfterScreenUpdates:NO]; [self.view addSubview:self.snapshotView]; } @end 

A continuación, le indicamos cómo puede usarlo en su código didFinishLaunching:

 if ([[UIScreen screens] count] > 1) { UIScreen *secondScreen = [[UIScreen screens] objectAtIndex:1]; // [...] self.secondWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 1280, 720)]; self.secondWindow.backgroundColor = [UIColor blueColor]; self.secondWindow.screen = secondScreen; MirrorViewController *mirrorViewController = [[MirrorViewController alloc] initWithViewToMirror:self.window.rootViewController.view]; self.secondWindow.rootViewController = mirrorViewController; self.secondWindow.hidden = NO; } 

No lo he probado en un iPad con pantalla externa porque no tengo el equipo.

Primero verifica la presencia de una pantalla externa al inicio de la aplicación. Si hay una segunda pantalla disponible, crea una window para ello. Utilicé el código siguiente en mi aplicación.

 (void)checkForExistingScreenAndInitializeIfPresent { if ([[UIScreen screens] count] > 1) { // Get the screen object that represents the external display. UIScreen *secondScreen = [[UIScreen screens] objectAtIndex:1]; // Get the screen's bounds so that you can create a window of the correct size. CGRect screenBounds = secondScreen.bounds; self.secondWindow = [[UIWindow alloc] initWithFrame:screenBounds]; self.secondWindow.screen = secondScreen; // Set up initial content to display... // Show the window. self.secondWindow.hidden = NO; } } 

Se registra para las notifications de connection y desconnection mediante el siguiente código.

 (void)setUpScreenConnectionNotificationHandlers { NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(handleScreenDidConnectNotification:) name:UIScreenDidConnectNotification object:nil]; [center addObserver:self selector:@selector(handleScreenDidDisconnectNotification:) name:UIScreenDidDisconnectNotification object:nil]; } 

Manejando notifications de connection y desconnection de pantalla

 (void)handleScreenDidConnectNotification:(NSNotification*)aNotification { UIScreen *newScreen = [aNotification object]; CGRect screenBounds = newScreen.bounds; if (!self.secondWindow) { self.secondWindow = [[UIWindow alloc] initWithFrame:screenBounds]; self.secondWindow.screen = newScreen; // Set the initial UI for the window. } } (void)handleScreenDidDisconnectNotification:(NSNotification*)aNotification { if (self.secondWindow) { // Hide and then delete the window. self.secondWindow.hidden = YES; self.secondWindow = nil; } } 

Si no crea una window para la pantalla, o si crea una window pero no la muestra, aparecerá un campo negro en la pantalla externa.

No hay garantía de que todos los modos estarán disponibles en una pantalla externa, por lo que no debe depender de la disponibilidad de un modo específico.

En casos raros, es posible que desee utilizar un valor diferente para la propiedad overscanCompensation , pero hacerlo siempre resulta en más trabajo que debe hacer. Por ejemplo, si usa UIScreenOverscanCompensationInsetBounds , debe estar preparado para manejar los límites de los tamaños de visualización no estándar.