2012-04-08 16 views
9

eine Design/Architektur Frage zu Airplay. Ich habe Setup ein externes Display im AppDelegate:Airplay: Spiegel Unteransicht auf externes Fenster

UIScreen *externalScreen = UIScreen.screens.lastObject; 
self.externalWindow = [[UIWindow alloc] initWithFrame:externalScreenFrame]; 
self.externalWindow.screen = externalScreen; 
self.externalWindow.backgroundColor = [UIColor redColor]; 

schöne Werke, TV zeigt einen leeren Bildschirm in rot. Jetzt habe ich einen ViewController mit einer Reihe von Subviews, und eine Ansicht sollte auf dem Gerät und der externe Bildschirm angezeigt werden. Wenn ich versuche, dies in ViewController.m:

[_appDelegate.externalWindow addSubview:self.deviceAndTVView]; 

deviceAndTVView zeigt nur auf dem externen Bildschirm, auf dem Gerät nicht mehr. Was ich brauche, ist DeviceAndTVView auf dem Gerät zu haben, sich selbst auf Berührungen/Benutzerinteraktion aktualisiert, und diese Updates auf dem externen Bildschirm spiegeln.

Welches ist der richtige Weg, um das zu erreichen?

Danke fürs Lesen! m

Antwort

14

Die Technologie namens AirPlay-Spiegelung ist schlecht benannt. Es funktioniert tatsächlich in zwei Modi, einer, bei dem das gesamte iOS-Gerät auf das AirPlay-Gerät gespiegelt wird, und in einem anderen Modus, in dem das Spiegelungs-AirPlay-Gerät angeschlossen ist, verfügt der Entwickler über zwei UIWindow/UIS-Bildschirme.

Sie verwenden den letzteren Modus, der oft als "Spiegelung" bezeichnet wird, aber Sie müssen wirklich ein völlig separates Fenster/Bildschirm verwalten und es sollte eine bessere Terminologie für diese Betriebsart geben.

Was Sie oben beschreiben, ist im Grunde Verschieben ein UIView aus dem Gerätefenster in das AirPlay-Fenster, und es funktioniert genau so, wie es sollte!

Es gibt keine technische Möglichkeit für Sie, eine einzelne Instanz haben einer UIView zeigen auf diese beiden Fenster - es wird in einer UIView Hierarchie vorhanden ist oder das andere, aber nicht beides zugleich. Mit anderen Worten, wenn Sie möchten, dass das gleiche auf beiden Bildschirmen angezeigt wird, müssen Sie zwei Instanzen derselben UIView erstellen und sie jeweils zu den beiden Fenstern hinzufügen und dann beide aktualisieren, wenn sie sich ändern.

Auch wenn dies nicht die superkonvivente "Spiegelung" ist, die Sie erwartet haben, ist es wahrscheinlich eine gute Sache, weil Ihr UIView auf dem Gerät ein anderes Seitenverhältnis als auf dem AirPlay-Gerät hat. Wenn Sie zwei verschiedene Ansichten mit demselben Inhalt verwenden, können Sie die Größe der AirPlay-Ansicht anpassen, um die verfügbare Auflösung des Geräts bestmöglich zu nutzen.

+0

Danke, Sie haben Recht. Es ist die einzige Option, zwei Ansichten zu erstellen und sie parallel zu verwalten. Für alle Interessierten ist dies in Apples Dokumentation [hier] beschrieben (http://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingWindows/CreatingWindows.html#//apple_ref/doc/uid/ TP40009503-CH4-SW9) unter "Inhalte auf einem externen Display anzeigen". – marimba

+0

Seit iOS 7 können Sie die Snapshot-API verwenden, um eine bestimmte UIView auf dem anderen Bildschirm anzuzeigen – jjxtra

1

Ich kann mir ein paar Möglichkeiten vorstellen, dies zu tun. Haben Sie KVO dafür angeschaut? Sowohl die lokalen als auch die externen Ansichten können beobachten, welches Modell oder welcher Controller den Inhalt steuert.