2011-11-11 14 views
24

Así que, como dice el título, tengo un hdmi en el iPad y un observador registrado para las conexiones de pantalla, al conectarse el usuario elige la res y una vista es salida.IOS - La salida externa (hdmi) llena solo la mitad de la pantalla excepto cuando se codifica la vista manualmente

Sin embargo, si cargo una vista desde una punta, o incluso desde un controlador de vista programática, el ipad muestra una vista horizontal en vertical (sí, ambas situaciones se configuran en horizontal).

I.e.

ExternalViewController *ex = [[ExternalViewController alloc] init]; 
[externalWindow setRootViewController:ex]; 

hace esto:

Bad Si creo la propia vista mediante programación. de este modo:

UIView *test = [[UIView alloc] initWithFrame:[externalScreen applicationFrame]]; 
[test setBackgroundColor:[UIColor whiteColor]]; 
UILabel *msgLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 40, 100, 30)]; 
msgLabel.text = @"External!"; 
[test addSubview:msgLabel]; 

Se ejecuta como una forma de sueño mágico:

good

Sin embargo quiero que el viewcontroller para cargar (y funciona!) así que, stackoverflow, te pido. ¿Alguien ha encontrado esto antes?

EDITAR: No hace falta decir que las respuestas sensuales comunes no reciben una recompensa, estoy buscando una solución, no una solución. Con mi cerebro limitado, todo lo que puedo hacer es crear un método que cree una vista basada en sus entradas y lo agregue como una subvista del monitor externo, ¡está claro que se trata de una solución de hackeo por lo que se aprecia una solución! ¡Gracias!

EDIT:

-(id)initWithFrame:(CGRect)_rect 
{ 
    rect = _rect; 
    if (self = [super init]) 
    { 
     externalView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"105.png"]]; 
     externalView.alpha = 0.0; 
     [externalView setFrame:rect]; 
     [externalView setBackgroundColor:[UIColor yellowColor]]; 
     self.view = [[UIView alloc] initWithFrame:rect]; 
     self.view.backgroundColor = [UIColor whiteColor]; 

     return self; 
    } 
} 

- (void)loadView 
{ 
    self.view = [[UIView alloc] initWithFrame:rect]; 
    self.view.backgroundColor = [UIColor blackColor]; 
    [self.view addSubview:externalView]; 
} 

Conforme a lo solicitado, esto es como yo estoy cargando la viewcontroller, la inicialización con el tamaño de la pantalla externa. Gracias

+0

¿La "vista del paisaje en el retrato" está truncada o girada? Quiero decir, si agrega una etiqueta como en su segundo ejemplo, ¿aparece esto en la esquina superior izquierda de la pantalla o en la esquina inferior izquierda en un ángulo de 90 grados? – jrturton

+0

Lo siento, debería haber explicado. Cuando ve la vista en la mitad de la pantalla, es horizontal pero girada. Entonces, si agrego una etiqueta, la muestra rotada con el texto de abajo hacia arriba. –

+0

¿Podría incluir código del método 'loadView' de su controlador de vista 'nibless', que muestra cómo está creando las vistas, de dónde obtiene las dimensiones para la pantalla externa, etc.? – jrturton

Respuesta

4

Simplemente devuelva NO en - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation en su subclase UIViewController.

// ugly, don't use this in real code 

if ([UIScreen screens].count == 1) return; // just one screen, eww. 

// getting the secondary screen 
UIScreen *screen = [[UIScreen screens] objectAtIndex:1]; 

__block UIScreenMode *highestWidthMode = NULL; 

[screen.availableModes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    UIScreenMode *currentModeInLoop = obj; 
    if (!highestWidthMode || currentModeInLoop.size.width > highestWidthMode.size.width) 
    highestWidthMode = currentModeInLoop; 
}]; 

// setting to the highest resolution available 
screen.currentMode = highestWidthMode; 

NSLog(@"screen.currentMode = %@", screen.currentMode); 
screen.overscanCompensation = UIScreenOverscanCompensationScale; 


// initializing screen 
secondWindow = [[UIWindow alloc] initWithFrame:[screen bounds]]; 
[secondWindow setScreen:screen]; 

// other view is a UIViewController, just remember to return NO in - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation or the iOS will rotate the frame. 

UIViewController *vc = [[OtherView alloc] initWithNibName:@"OtherView" bundle:nil]; 
secondWindow.rootViewController = vc; 
[secondWindow makeKeyAndVisible]; 
+0

No, lo intenté. Creo que la vista realmente lo cree, dando como resultado en el paisaje la pantalla necesaria. –

+0

Cargaré una muestra de trabajo, un segundo. –

Cuestiones relacionadas