2010-04-17 15 views
6

HI lì,Utilizzando UIScreen per pilotare un display VGA - non sembra che mostri UIWindow?

Sto provando a utilizzare UIScreen per guidare uno schermo separato con il dongle VGA sul mio iPad.

Ecco quello che ho nella mia viewDidLoad radice vista del controllore:

//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

Che cosa rende così specifico l'iPad? Puoi anche inviare a un display esterno su iPhone? – Ali

risposta

8

È necessario inizializzare la finestra ...

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

Grazie mille per questo!Questo è stato! Non posso credere di aver dimenticato ... –

2

[newwindow makeKeyAndVisible];?

+1

L'ho aggiunto subito dopo l'ultima riga e sembra che faccia ancora la stessa cosa. È interessante, perché posso dire (usando il mio monitor) quando il display VGA è stato "rivendicato" dall'app, è la stessa cosa che accade quando viene lanciato Keynote; il display non ritorna alla modalità DVI o passa alla modalità sospensione. Potrebbe esserci un problema con il controller di visualizzazione ExternalDisplay? È piuttosto benigno, solo un file .xib con UIImageView, niente di complesso. Grazie per il suggerimento! –

+0

Ora ho una vista sull'uscita VGA Sfortunatamente, qualsiasi modifica al parametro drawImage di externalDisplay sembra non funzionare. Ho aggiunto altri IBOutlet che funzionano, ma non drawImage (che è un UIImageView). Qualche idea? –

+0

Grazie Noah - questo in realtà faceva parte del mio problema, ma ho dimenticato di inizializzare anche la finestra. Grazie per la risposta! –

2

Credo che il problema è l'externalDisplay. Crea un viewcontroller al di fuori del tuo codice (magari fai un semplice Aggiungi nuovo file ViewController e metti cose nel .xib) e provalo per assicurarti che viewcontroller funzioni prima di chiamarlo sul display esterno. Ecco il tuo codice con le mie modifiche suggerite - [vista mainViewController] è il viewcontroller che hai creato all'esterno.

//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

Ha bisogno di essere ricordato che il codice fornito in questa pagina e sul link GitHub da igaiga è semplicemente lo scopo di "muovere" (NON clone) l'opinione che sarebbe normalmente sul iPad (o altro dispositivo).

Se avete bisogno di clonare (aka Mirror) la vista e aggiornare il suo contenuto questo link è più adatto: http://www.touchcentric.com/blog/archives/123

Spero che questo aiuta a chiarire i casi d'uso per entrambi i gruppi di codice per gli utenti appena iniziando a integrare le funzionalità di uscita video in app esistenti.

2

Basta registrarlo qui nel caso in cui qualcuno si imbatta in questa domanda. Non sono riuscito a ottenere nulla da mostrare sul secondo schermo fino a quando non ho capito che il mio delegato dell'app doveva conservare UIWindow. Non ha un proprietario naturale, quindi se fai una semplice autoricolazione regolare, la finestra verrà rilasciata prima che venga visualizzata.

Spero che questo aiuti.

+1

Lavorare su qualcosa di simile ho avuto anche questo problema, grazie! Sto usando ARC e non pensavo nemmeno a chi lo avrebbe conservato. – jblocksom