2014-11-05 4 views
9

Ich mache eine Media Player App. Ich habe UITableViewControllers, die in Navigation Controller eingebettet sind. Ich möchte irgendwie eine Ansicht machen, die möglicherweise mehrere (2?) Dieser Tableview-Controller überlagert (eine, die die Wiedergabelisten des Benutzers zeigt, und die nächste würde die Titel in der Wiedergabeliste anzeigen), aber nur unten, wie ein gerade spielender Bar in (zB) iOS App Spotify (wie in der linken unteren Seite dieserWie mache ich eine gerade spielende Leiste wie in Media Player-Apps in iOS mit XCode?

enter image description here

oder wie in diesem

enter image description here

ich habe versucht, einen Container Blick in meine Navigation ziehen Controller (in dem meine TableViewCell eingebettet ist), wird es aber nicht lassen Ich lasse es dort fallen.

Es sieht so aus, als könnte ich die Containeransicht in mein TableView ziehen, aber wie würde es dann dort bleiben, wenn ich zwischen Tabellenansichten navigiere?

Versuchen, @ Rintaro Vorschlag zu folgen, aber ich bin ein wenig neu für XCode. Wie hast du das gemacht? Also habe ich eine einzelne Ansichts-Anwendung erstellt, ich habe eine Container-Ansicht der ersten VC hinzugefügt, sie wird sie woanders im Storyboard zeichnen, aber ich kann nicht herausfinden, wie ich diese Ansicht erkennen kann, dass es ein Navigations-Controller ist. Sobald ich dem ersten VC einen zweiten Container hinzufüge und versuche, ihn zu skalieren, verschwindet der erste Container! Es ist immer noch in der Hierarchie auf der linken Seite aufgeführt und weist immer noch einen Pfeil darauf hin, aber der View-Controller, der hinzugefügt wurde und auf den gezeigt wurde, ist ebenfalls unsichtbar ?!

enter image description here

enter image description here

UPDATE: Das funktioniert sehr gut, aber es ein Problem mit Orientierungsänderungen hat. wie kann ich das in beiden ausrichtungen machen? (Ich stelle die Hypothese auf, dass die "Nowplaying-Ansicht" derzeit vom Bildschirm entfernt wird, wenn sich die Ausrichtung ändert).

Antwort

19

Grundsätzlich, Ansichtshierarchie so wie diese aufgebaut ist:

screenshot

Verwendung von zwei „Container-Ansicht "In der ersten Ansicht Controller, einer für Navigation Controller, einer für" Now Playing Bar "View Controller.

ZUSÄTZLICH:

"Haupt Container-View-Controller" würde Ihre eigene UIViewController Unterklasse sein. Es wird die Verantwortung haben, "Now Playing Bar" ein- oder auszublenden.


Workaround für seltsame Verhalten von Interface Builder.

Sie können Auto-Layout-Einschränkungen wie folgt festlegen. Vielleicht möchten Sie die Ansicht aus dem linken Menü auswählen.

Beachten Sie, dass Sie deaktivieren Sie das KontrollkästchenConstrain to margins Kontrollkästchen.

Container-Ansicht für Navigation Controller:

screenshot

Container-Ansicht für Jetzt Bar Controller:

screenshot

Und dann Update Frames aus dem Menü:

screenshot

+0

danke für Ihren Beitrag, ich habe meine Frage mit meinem Versuch, Ihre Antwort folgen, scheint vielversprechend aus Ihrem Screenshot! Was für View Controller ist der "Main Container View Controller"? Ich sehe nichts in der Objektbibliothek, die dieses Symbol hat? – Michael

+0

Hauptcontroller ist der einfache UIViewController, der 2 UIContainerViews enthält. Gute Idee. –

+1

@Michael Zu der Antwort hinzugefügt. – rintaro

0

Offensichtlich müssen Sie eine benutzerdefinierte UIView-Klasse erstellen, in der Sie dieses Menü anzeigen. Und wenn Sie es schaffen wird, fügen Sie ihn einfach auf Ihre Ansicht wie hier:

float y = ROOTVC.view.frame.size.height - 49; 
[self setFrame:CGRectMake(0, y, 320, 49)]; 
[ROOTVC.view addSubview:self]; 
[ROOTVC.view bringSubviewToFront:self]; 
+0

Ich habe das tatsächlich versucht, aber es scheint nicht zu zeigen. Zu welcher VC sollte es als Subview hinzugefügt werden? – Michael

+0

@Michael fügen Sie es zu Ihrem root VC - UINavigationController. Probieren Sie dieses Snippet '#define ROOTVC [[[[UIApplication sharedApplication] delegate] Fenster] rootViewController]' –

0

Ich würde einfach eine nowPlayingView zum appDelegate.window hinzufügen und anpassen entweder:

  • Der window.rootController.view Rahmen der nowPlayingView Überschneidungen zu vermeiden.

  • Wenn window.rootController.view ein UIScrollView ist, stellen seine contentInset.bottom zu vermeiden, dass die nowPlayingView überlappen. Sie können mit dieser Lösung auch Transparenz/Transluzenz verwenden.

  • Fügen Sie dem Controller eine Dummy-Symbolleiste hinzu, die von nowPlayingView abgedeckt wird.

Wenn Ihr window.rootController ein UINavigationController ist, dann haben Sie wahrscheinlich zu den oben Vordergrund tun jeden Controller Sie drücken. Die nowPlayingView bleibt unverändert oben.

2

Wenn Sie manuell Schaltflächen mit absoluten Koordinaten platzieren, stellen Sie sicher, dass Sie die Koordinaten aktualisieren, wenn die Drehung geändert wird.

+2

Dies scheint eher ein Kommentar als eine tatsächliche Antwort zu sein – Rizier123

+0

Ich habe die Position des nowplayviewview basierend auf der Bildschirmgröße festgelegt, aber wenn Sie drehen, sollte ich dann die transponierten Dimensionen verwenden (z. B. Bildschirmbreite, um Y-Position einzustellen). Vielen Dank! – Michael