2010-04-17 15 views
6

HI allí,Usando UIScreen para manejar una pantalla VGA, ¿no parece mostrar la ventana UI?

Estoy tratando de usar UIScreen para conducir una pantalla separada con el dongle VGA en mi iPad.

Esto es lo que tengo en mi viewDidLoad raíz del controlador de vista:

//Code to detect if an external display is connected to the iPad. 
NSLog(@"Number of screens: %d", [[UIScreen screens]count]); 

//Now, if there's an external screen, we need to find its modes, itereate through them and find the highest one. Once we have that mode, break out, and set the UIWindow. 

if([[UIScreen screens]count] > 1) //if there are more than 1 screens connected to the device 
{ 
    CGSize max; 
    UIScreenMode *maxScreenMode; 
    for(int i = 0; i < [[[[UIScreen screens] objectAtIndex:1] availableModes]count]; i++) 
    { 
    UIScreenMode *current = [[[[UIScreen screens]objectAtIndex:1]availableModes]objectAtIndex:i]; 
    if(current.size.width > max.width); 
    { 
    max = current.size; 
    maxScreenMode = current; 
    } 
    } 
    //Now we have the highest mode. Turn the external display to use that mode. 
    UIScreen *external = [[UIScreen screens] objectAtIndex:1]; 
    external.currentMode = maxScreenMode; 
    //Boom! Now the external display is set to the proper mode. We need to now set the screen of a new UIWindow to the external screen 
    external_disp = [externalDisplay alloc]; 
    external_disp.drawImage = drawViewController.drawImage; 
    UIWindow *newwindow = [UIWindow alloc]; 
    [newwindow addSubview:external_disp.view]; 
    newwindow.screen = external; 
} 
+1

¿Qué tiene el iPad específico sobre esto? ¿Puedes hacer una salida a una pantalla externa en iPhone también? – Ali

Respuesta

8

Es necesario para inicializar la ventana ...

UIWindow *newwindow = [[UIWindow alloc] init]; 
+0

¡Muchas gracias por esto!Esto lo hizo! No puedo creer que olvidé ... –

2

[newwindow makeKeyAndVisible];?

+1

He añadido esto justo después de la última línea, y todavía parece hacer lo mismo. Es interesante, porque puedo decir (usando mi monitor) cuando la pantalla VGA ha sido "reclamada" por la aplicación, es lo mismo que ocurre cuando se lanza Keynote; la pantalla no volverá al modo DVI ni se apagará. ¿Podría haber un problema con mi controlador de vista de pantalla externo? Es bastante benigno, solo un archivo .xib con UIImageView, nada complejo. ¡Gracias por la sugerencia! –

+0

Ahora tengo una vista mostrada en la salida VGA Desafortunadamente, cualquier cambio en el parámetro drawImage de la pantalla externa parece no funcionar. He agregado otros IBOutlets que funcionan, pero no drawImage (que es un UIImageView). ¿Algunas ideas? –

+0

Gracias Noah - esto en realidad era parte de mi problema, pero me olvidé de inicializar la ventana también. ¡Gracias por su respuesta! –

2

Creo que su problema es la externalDisplay. Cree un controlador de visualización fuera de su código (tal vez simplemente agregue un nuevo archivo ViewController y coloque cosas en .xib) y pruébelo para asegurarse de que el controlador de visualización esté funcionando antes de llamarlo a la pantalla externa. Aquí está su código con mis cambios sugeridos - [vista de control principal] es el controlador de vista que creó fuera.

//Code to detect if an external display is connected to the iPad. 
NSLog(@"Number of screens: %d", [[UIScreen screens]count]); 

//Now, if there's an external screen, we need to find its modes, iterate 
//through them and find the highest one. Once we have that mode, break out, 
//and set the UIWindow. 

if([[UIScreen screens]count] > 1) //if there are more than 1 screens connected 
            //to the device 
{ 
CGSize max; 
UIScreenMode *maxScreenMode; 
for(int i = 0; i < [[[[UIScreen screens] objectAtIndex:1] availableModes]count]; i++) 
{ 
    UIScreenMode *current = [[[[UIScreen screens]objectAtIndex:1]availableModes]objectAtIndex:i]; 
    if(current.size.width > max.width); 
    { 
    max = current.size; 
    maxScreenMode = current; 
    } 
} 
//Now we have the highest mode. Turn the external display to use that mode. 
UIScreen *external = [[UIScreen screens] objectAtIndex:1]; 
external.currentMode = maxScreenMode; 
//Boom! Now the external display is set to the proper mode. We need to now 
//set the screen of a new UIWindow to the external screen 

UIWindow *newwindow = [UIWindow alloc]; 

[newwindow addSubview:[mainViewController view]]; 
newwindow.screen = external; 

[newwindow makeKeyAndVisible]; 
[newwindow setHidden:NO]; 
} 
0

Es necesario mencionar que el código proporcionado en esta página y en el enlace github por igaiga es meramente la intención de "movimiento" (NO clonar) la opinión de que sería normalmente en el IPAD (u otro dispositivo).

Si necesita clonar (también conocido como espejo) la vista y refrescar su contenido este enlace es más adecuado: http://www.touchcentric.com/blog/archives/123

espero que esto ayuda a aclarar los casos de uso para ambos conjuntos de código para los usuarios que acaba de empezar a integrar capacidades de salida de video en aplicaciones existentes.

2

Simplemente registrando esto aquí en caso de que alguien se tropiece con esta pregunta. No pude obtener nada para mostrar en la segunda pantalla hasta que me di cuenta de que mi delegado de aplicaciones tenía que conservar la ventana de UI. No tiene dueño natural, por lo que si solo hace una liberación automática regular, la ventana se lanzará antes de que se muestre.

Espero que ayude.

+1

Trabajando en algo similar también tuve ese problema, ¡gracias! Estoy usando ARC y ni siquiera estaba considerando quién lo retendría. – jblocksom

Cuestiones relacionadas