Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 Hello iPhone
2 Die Reise nach iOS
3 Sehen und anfassen
4 Alles unter Kontrolle
5 Daten, Tabellen und Controller
6 Models, Layer, Animationen
7 Programmieren, aber sicher
8 Datenserialisierung und Internetzugriff
9 Multimedia
10 Jahrmarkt der Nützlichkeiten
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
Apps programmieren für iPhone und iPad von Klaus M. Rodewig, Clemens Wagner
Das umfassende Handbuch
Buch: Apps programmieren für iPhone und iPad

Apps programmieren für iPhone und iPad
Rheinwerk Computing
1172 S., geb., mit DVD
49,90 Euro, ISBN 978-3-8362-2734-6
Pfeil 4 Alles unter Kontrolle
Pfeil 4.1 Viewcontroller, XIBs und Storyboards
Pfeil 4.1.1 Erstellung von Viewcontrollern über XIB-Dateien
Pfeil 4.1.2 Applikationsinitialisierung
Pfeil 4.1.3 Storyboards
Pfeil 4.1.4 Modale Dialoge
Pfeil 4.1.5 Pop-over
Pfeil 4.1.6 Übergänge
Pfeil 4.2 Der Navigationcontroller
Pfeil 4.2.1 Viewcontroller anzeigen und entfernen
Pfeil 4.2.2 Die Navigationsleiste
Pfeil 4.2.3 Der Zurück-Button
Pfeil 4.2.4 Gehe drei Felder zurück
Pfeil 4.2.5 Die Werkzeugleiste
Pfeil 4.3 Navigation- und Pop-over-Controller in der Praxis
Pfeil 4.3.1 Navigationcontroller anlegen
Pfeil 4.3.2 Einen Dialog für die Einstellungen gestalten
Pfeil 4.3.3 Früher war alles besser ...
Pfeil 4.3.4 Einstellungen dauerhaft speichern
Pfeil 4.3.5 Storyboard lokalisieren
Pfeil 4.3.6 Anpassung an das iPad
Pfeil 4.4 Der Splitviewcontroller
Pfeil 4.4.1 Das Splitviewcontroller-Delegate
Pfeil 4.4.2 Eine Projektvariante erstellen
Pfeil 4.4.3 Rotationsverhalten für einzelne Viewcontroller ändern
Pfeil 4.4.4 Anlegen eines Splitviewcontrollers
Pfeil 4.4.5 Autolayout-Restriktionen per Programmcode erstellen
Pfeil 4.4.6 Anzeige des Masters
Pfeil 4.5 Der Tabbarcontroller
Pfeil 4.5.1 Aufbau einer Reiternavigation
Pfeil 4.5.2 Plaketten
Pfeil 4.5.3 Für ein paar Controller mehr
Pfeil 4.6 Der Page-Viewcontroller
Pfeil 4.6.1 Einen Page-Viewcontroller erzeugen
Pfeil 4.6.2 Die Datenquelle und das Delegate
Pfeil 4.7 Eigene Container- und Subviewcontroller
Pfeil 4.7.1 Container- und Subviewcontroller
Pfeil 4.7.2 Verwaltung der Subviewcontroller
Pfeil 4.7.3 ContainerViews leicht gemacht
Pfeil 4.8 Regelbasierte Anpassung der Oberfläche
Pfeil 4.8.1 Gestaltungsregeln ...
Pfeil 4.8.2 ... und Gestaltungsmöglichkeiten

Rheinwerk Computing - Zum Seitenanfang

4.7Eigene Container- und SubviewcontrollerZur nächsten Überschrift

In diesem Kapitel haben Sie bereits mehrere Container-Viewcontroller wie beispielsweise den Splitview- oder den Tabbarcontroller kennengelernt. Daneben sind natürlich auch viele andere Container-Viewcontroller denkbar. Dieser Abschnitt zeigt Ihnen, wie Sie eigene Container-Viewcontroller verwirklichen können.


Rheinwerk Computing - Zum Seitenanfang

4.7.1Container- und SubviewcontrollerZur nächsten ÜberschriftZur vorigen Überschrift

Mit iOS 5 hat Apple die Klasse UIViewController um mehrere Methoden erweitert, die Ihnen eine nahezu beliebige Verschachtelung der Views Ihrer Viewcontroller erlauben. Es gibt zwei wesentliche Anwendungsfälle, in denen diese neuen Methoden zum Einsatz kommen:

  • Container-Viewcontroller zeigen einen oder mehrere andere Viewcontroller an und organisieren den Wechsel zwischen diesen Controllern. Das iOS stellt beispielsweise mit dem Splitview-, Navigation- und Tabbarcontroller auch Container-Viewcontroller bereit.
  • Ein Subview mit eigenem Controller belegt nur einen Teil der Bildschirmfläche. Ihn fügt entweder der Controller des Hauptviews ein, wie das bei presentViewController:animated:completion: auf dem iPad und der Darstellungsart UIModalPresentationPageSheet geschieht. Oder es klinkt sich ein Subviewcontroller selbständig in den Hauptview ein, wie das der Pop-over-Viewcontroller macht.

Projektinformation

Den Quellcode des folgenden Beispielprojekts finden Sie auf der DVD unter Code/Apps/iOS5/Container oder im Github-Repository zum Buch im Unterverzeichnis https://github.com/Cocoaneheads/iPhone/tree/Auflage_3/Apps/iOS5/Container.

Das Vorgehen für Container-Viewcontroller und Subviews mit Controllern ist sehr ähnlich. Sie fügen den inneren Controller über die Methode addChildViewController: zum äußeren hinzu. Außerdem fügen Sie den View des inneren Controllers an einer beliebigen Stelle in den View des äußeren ein. Nach Abschluss aller Operationen senden Sie an den inneren Controller noch die Nachricht didMoveToParentViewController: mit dem äußeren Viewcontroller als Argument.

Die Klasse RaisingSegue setzt genau diese Schritte um; sie implementiert die Methode perform, die den neuen Subview von links unten aufzieht. Da Kapitel 6, »Models, Layer, Animationen«, genauer auf Animationen und Blockfunktionen eingeht, gibt Listing 4.52 nur eine verkürzte Version ohne Animation wieder. Den vollständigen Quellcode mit Animationen finden Sie jedoch auf der DVD.

- (void)perform {
UIViewController *theFromViewController =
self.sourceViewController;
UIViewController *theToViewController =
self.destinationViewController;
CGRect theBounds = theFromViewController.view.bounds;
UIView *theView = theToViewController.view;
UIView *theBackgroundView =
[[UIView alloc] initWithFrame:theBounds];

[theFromViewController
addChildViewController:theToViewController];
theBackgroundView.backgroundColor =
[UIColor colorWithWhite:0.0 alpha:0.5];
theBackgroundView.autoresizingMask =
UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleHeight;
[theBackgroundView addSubview:theView];
[theFromViewController.view addSubview:theBackgroundView];
theView.frame = CGRectInset(theBounds, 20.0, 20.0);
[theToViewController
didMoveToParentViewController:theFromViewController];
}

Listing 4.52 Einfügen eines Subviews mit eigenem Controller

Die Implementierung belegt für den Subview hingegen nicht die komplette Fläche des Hauptviews, sondern nur ein kleineres Rechteck. Um die UI-Elemente außerhalb des Subviews zu sperren, legt der Übergang den Subview in einen View mit schwarz-transparenter Hintergrundfarbe. Diese Farbgebung bewirkt ein Ausgrauen des Hintergrunds, also des Hauptviews, und zeigt so dem Nutzer die Sperrung an.

Das Beispielprogramm lässt den Subviewcontroller über die Action-Methode close der Klasse SupernumeraryViewController wieder verschwinden. Während Sie nach dem Erscheinen des Subviews die Methode didMoveToParentViewController: des Controllers aufrufen müssen, müssen Sie vor dem Verschwinden die Methode willMoveToParentViewController: aufrufen. Diese beiden Methoden können Sie verwenden, damit Ihre Subviewcontroller auf das Einfügen und das Entfernen reagieren können. Das Einfügen und Entfernen unterscheiden Sie dabei anhand des Parameters, der beim Entfernen nil ist.

Bewegungen zum Parentviewcontroller

Beim Anzeigen oder Verschwinden eines eingebetteten Controllers empfängt dieser immer die beiden Nachrichten willMoveToParentViewController: und didMoveToParentViewController:. Dabei müssen Sie allerdings nur die zweite Methode explizit mit dem Parentviewcontroller aufrufen (siehe Listing 4.52), wenn Sie den Subview anzeigen. Umgekehrt rufen Sie nur die erste Methode explizit mit dem Parameter nil auf (siehe Listing 4.53), wenn Sie den Subview verschwinden lassen. Der andere Methodenaufruf erfolgt dabei jeweils implizit durch Cocoa Touch, und Sie brauchen sich darum nicht zu kümmern.

Die Klasse des Subviewcontrollers darf übrigens beide Methoden überschreiben, um auf diese Ereignisse reagieren zu können. Dabei sollten die überschreibenden Methoden natürlich immer die entsprechende Methode in der Oberklasse aufrufen. Sie können diese Methoden beispielsweise als Ersatz für die Methoden des Anzeigezyklus (z. B. viewWillAppear:) verwenden.

Nach dem expliziten Aufruf von willMoveToParentViewController: können Sie den Subview aus der View-Hierarchie über die Methode removeFromSuperview entfernen und die Operation durch removeFromParentViewController abschließen. Den kompletten Code ohne die Anweisungen für die Animation sehen Sie in Listing 4.53.

- (IBAction)close {
UIViewController *theToViewController =
self.parentViewController;
CGRect theBounds = theToViewController.view.bounds;
UIView *theView = self.view;
UIView *theBackgroundView = theView.superview;

[self willMoveToParentViewController:nil];
[theBackgroundView removeFromSuperview];
[theView removeFromSuperview];
[self removeFromParentViewController];
}

Listing 4.53 Subviewcontroller entfernen

Die Klasse ContainerViewController des Beispielprojekts zeigt vier Subviews an, die jeweils ein eigener Viewcontroller verwaltet. Dabei fügt sie die Subviewcontroller analog zu Listing 4.52 hinzu. Die vier Subviews haben dabei alle die gleiche Größe und sind in jeweils zwei Reihen und Spalten angeordnet. Die Größe und Position könnte der Container-Viewcontroller natürlich schon beim Einfügen der Subviews festlegen. Allerdings wäre dieses Vorgehen relativ unflexibel bei Größenveränderungen oder Rotationen des Container-Views. Sinnvoller ist hier ein dynamisches Layout.

Dazu können Sie die Methode viewDidLayoutSubviews im Controller des Containers überschreiben. Ein Viewcontroller ruft diese Methode nach jeder Größenänderung seines Views auf. Die Klasse ContainerViewController des Beispielprojekts nutzt diese Methode, um die Views entsprechend anzuordnen.

- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
CGRect theBounds = self.containerView.bounds;
CGRect theFrame = CGRectMake(0.0, 0.0,
CGRectGetWidth(theBounds) / 2.0,
CGRectGetHeight(theBounds) / 2.0);
NSUInteger theIndex = 0;

for(UIViewController *theController in
self.viewControllers) {
UIView *theView = theController.view;
NSUInteger theColumn = theIndex % 2;
NSUInteger theRow = theIndex / 2;

theFrame.origin.x = theColumn * theFrame.size.width;
theFrame.origin.y = theRow * theFrame.size.height;
theView.frame = theFrame;
theIndex++;
}
}

Listing 4.54 Layout der Subviews über den Container-Viewcontroller


Rheinwerk Computing - Zum Seitenanfang

4.7.2Verwaltung der SubviewcontrollerZur nächsten ÜberschriftZur vorigen Überschrift

Wenn Sie einen Controller auf die beschriebene Art zu einem anderen Viewcontroller hinzufügen, erhält er automatisch alle Nachrichten über Viewrotationen. Sie können also beispielsweise die Methode didRotateFromInterfaceOrientation: wie gewohnt verwenden. Außerdem leitet der Parentviewcontroller die Nachrichten des Anzeigezyklus – wie beispielsweise viewWillAppear: – an die Subviewcontroller weiter. Im Beispielprogramm enthalten diese Methoden Log-Anweisungen, so dass Sie das leicht mitverfolgen können.

Allerdings ruft Cocoa Touch diese Methoden nicht unbedingt so auf, wie Sie es brauchen. Es kann ja schließlich nicht wissen, ob ein neuer Subview einen bestehenden verdrängt oder ob beide Subviews gleichzeitig sichtbar sind. Aus diesem Grund können Sie diese Nachrichten auch selbst an die Subviewcontroller verschicken.

Seit iOS 6 gibt es stattdessen zwei neue Methoden, über die Sie die Weiterleitungen für die Rotation und das Erscheinen getrennt steuern können. Die Methoden shouldAutomaticallyForwardRotationMethods und shouldAutomaticallyForwardAppearanceMethods liefern standardmäßig YES zurück. Sie können diese Methoden überschreiben, um die automatische Weiterleitung der entsprechenden Nachrichten zu unterdrücken.

Die Nachrichten über das Erscheinen und Verschwinden des Subviews versenden Sie über die Methoden beginAppearanceTransition:animated: und endAppearanceTransition. Dabei rufen Sie beginAppearanceTransition:animated: des Subviewcontrollers auf, bevor Sie den Subview in den ContainerView einfügen oder ihn daraus entfernen. Um welche Operation es sich handelt, legen Sie jeweils über den ersten Parameter fest; YES bedeutet Erscheinen und NO Verschwinden. Wenn Sie alle Anweisungen für die Änderung abgeschlossen haben, rufen Sie endAppearanceTransition auf. Die Animation der Klasse RaisingSegue können Sie beispielsweise folgendermaßen in diese Methoden kapseln:

[theFromViewController beginAppearanceTranssition:YES 
animated:YES];
UIView animateWithDuration:1.0
animations:^{
theBackgroundView.alpha = 1.0;
theView.transform = CGAffineTransformIdentity;
}
completion:^(BOOL inFinished) {
[theToViewController didMoveToParentViewController:
theFromViewController];
[theFromViewController endAppearanceTranssition];
}];

Listing 4.55 Versenden der Nachrichten zum Erscheinen des Subviews

Allerdings sind diese Aufrufe in dem Übergang nicht sinnvoll, da er ja nicht das automatische Weiterleiten der Ereignisse abschalten kann.


Rheinwerk Computing - Zum Seitenanfang

4.7.3ContainerViews leicht gemachtZur vorigen Überschrift

Mit iOS 6 ermöglicht Apple die Verwaltung von ContainerViews direkt im Interface Builder. Dazu ziehen Sie einen ContainerView aus der Bibliothek (siehe Abbildung 4.52) auf denjenigen View auf der Zeichenfläche, in den Sie den Viewcontroller einbetten möchten.

Abbildung

Abbildung 4.52 ContainerView in der Objektbibliothek

Der Interface Builder stellt den ContainerView über ein hellgraues Rechteck dar und legt automatisch einen neuen Viewcontroller an, den ein Übergang mit dem ContainerView verbindet. Sie können diese Verbindung ändern, indem Sie sie auf die übliche Weise vom ContainerView zum gewünschten Viewcontroller neu ziehen. Dadurch lassen sich beliebige Viewcontroller in einem ContainerView anzeigen.

Abbildung

Abbildung 4.53 ContainerView im Storyboard



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück




Copyright © Rheinwerk Verlag GmbH, Bonn 2014
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern


  Zum Rheinwerk-Shop
Zum Katalog: Apps programmieren für iPhone und iPad






Neuauflage: Apps programmieren für iPhone und iPad
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Einstieg in Objective-C 2.0 und Cocoa






Einstieg in Objective-C 2.0 und Cocoa


Zum Katalog: Spieleprogrammierung mit Android Studio






Spieleprogrammierung mit Android Studio


Zum Katalog: Android 5






Android 5


Zum Katalog: iPhone und iPad-Apps entwickeln






iPhone und iPad-Apps entwickeln


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo