2010-04-17 1 views
6

HI dort,Verwenden von UIScreen zum Steuern eines VGA-Displays - scheint das UIWindow nicht zu zeigen?

Ich versuche, UIScreen zu verwenden, um einen separaten Bildschirm mit dem VGA-Dongle auf meinem iPad zu fahren.

Hier ist, was ich in meinem Stammansicht Controller viewDidLoad bekam:

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

Was ist so spezifisch für iPad? Können Sie auch auf einem externen Display auf dem iPhone ausgeben? – Ali

Antwort

8

Sie benötigen Fenster init ...

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

Vielen Dank dafür!Das hat es geschafft! Ich kann nicht glauben, dass ich vergessen habe ... –

2

[newwindow makeKeyAndVisible];?

+1

Ich habe dies direkt nach der letzten Zeile hinzugefügt, und es scheint immer noch das Gleiche zu tun. Es ist interessant, weil ich sagen kann (mit meinem Monitor), wenn das VGA-Display von der App "beansprucht" wurde, ist es dasselbe, was passiert, wenn Keynote gestartet wird; Das Display schaltet nicht zurück in den DVI-Modus oder in den Ruhezustand. Könnte es ein Problem mit meinem externalDisplay View Controller geben? Es ist ziemlich gutartig, nur eine .xib-Datei mit einem UIImageView, nichts Komplexes. Danke für den Vorschlag! –

+0

Ich habe jetzt eine Ansicht auf dem VGA-Ausgang angezeigt Leider scheint keine Änderung der DrawImage-Parameter von externalDisplay zu funktionieren. Ich habe andere IBOutlets hinzugefügt, die funktionieren, aber nicht drawImage (was ein UIImageView ist). Irgendwelche Ideen? –

+0

Dank Noah - das war eigentlich Teil meines Problems, aber ich habe vergessen, das Fenster auch zu initialisieren. Vielen Dank für Ihre Antwort! –

2

Ich denke, das Problem der externalDisplay ist. Erstellen Sie einen Viewcontroller außerhalb Ihres Codes (vielleicht fügen Sie einfach eine neue Datei ViewController hinzu und legen Sie Sachen in die .xib) und probieren Sie es aus, um sicherzustellen, dass der Viewcontroller funktioniert, bevor Sie ihn auf dem externen Bildschirm aufrufen. Hier ist Ihr Code mit meinen vorgeschlagenen Änderungen - [mainViewController-Ansicht] ist der Viewcontroller, den Sie außerhalb erstellt haben.

//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 muss erwähnt werden, dass der Code auf dieser Seite und auf dem GitHub Link von igaiga vorgesehen ist lediglich zu „move“ (NICHT CLONT), um die Ansicht zu verstehen, die normalerweise auf dem iPad sein würden (oder anderes Gerät).

Wenn Sie (aka Mirror) die Ansicht klonen müssen und aktualisieren ihre Inhalte dieser Link ist besser geeignet: http://www.touchcentric.com/blog/archives/123

Ich hoffe, dass dies die Anwendungsfälle für beide Sätze von Code für die Benutzer beginnen zu klären hilft nur zu integrieren Videofunktionen in bestehende Apps integrieren

2

Nur aufzeichnen hier für den Fall, dass jemand auf diese Frage stolpert. Ich konnte nichts auf dem zweiten Bildschirm sehen, bis ich merkte, dass mein App-Delegierter das UIWindow behalten musste. Es hat keinen natürlichen Besitzer, also wenn Sie nur eine regelmäßige Autorelease durchführen, wird das Fenster freigegeben, bevor es überhaupt angezeigt wird.

Hoffe, dass hilft.

+1

Arbeiten an etwas ähnliches hatte ich auch dieses Problem, danke! Ich benutze ARC und habe nicht einmal darüber nachgedacht, wer es behalten würde. – jblocksom

Verwandte Themen