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

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.6Der Page-ViewcontrollerZur nächsten Überschrift

Eine weitere Möglichkeit, zwischen den Viewcontrollern einer App zu navigieren, ist eine Wischnavigation, bei der Sie auf dem Bildschirm nach rechts oder links streichen, um zur vorherigen oder nächsten Seite zu gelangen. Mit der Klasse UIPageViewController steht ein Container-Viewcontroller zur Verfügung, der das Blättern zwischen beliebig vielen Viewcontrollern erlaubt. Er animiert dabei den Wechsel durch eine Blätteranimation, die das Umschlagen einer Buchseite (horizontales Blättern) oder eines Kalenderblattes (vertikales Blättern) nachahmt. Seit iOS 6 gibt es außerdem eine Scroll-Animation. Sie können bei der Blätteranimation eine von drei möglichen Achsen wählen:

  • UIPageViewControllerSpineLocationMin: der linke oder obere Rand des Views
  • UIPageViewControllerSpineLocationMid: die horizontale oder vertikale Mittelachse des Views
  • UIPageViewControllerSpineLocationMax: der rechte oder untere Rand des Views

Ein- und doppelseitige Darstellung

Die doppelseitige Darstellung des Page-Viewcontrollers eignet sich in der Regel nur im Querformat beim horizontalen Blättern oder im Hochformat beim vertikalen Blättern. Über die Delegate-Methode pageViewController:spineLocationForInterfaceOrientation: können Sie die Bezugsposition für das Blättern bei einer Viewrotation ändern.

Wenn der Page-Viewcontroller eine Mittelachse als Bezug verwendet, stellt er immer zwei Viewcontroller gleichzeitig dar, ansonsten nur einen. In diesem Fall können Sie eine doppelseitige Darstellung über die Property doubleSided wählen. Dann verwendet der Page-Viewcontroller jeden zweiten Controller zur Darstellung der Rückseite seines jeweiligen Vorgängers.

Bei der einseitigen Darstellung verwendet der Page-Viewcontroller hingegen ein stark aufgehelltes, gespiegeltes Abbild der ungeraden Seiten für die Rückseiten.

Die Kehrseite der Medaille

Verwenden Sie die doppelseitige Darstellung nur mit der Curl-Animation; sie ergibt nicht nur bei der Scroll-Animation keinen Sinn, sondern kann sogar zu Abstürzen führen.


Rheinwerk Computing - Zum Seitenanfang

4.6.1Einen Page-Viewcontroller erzeugenZur nächsten ÜberschriftZur vorigen Überschrift

Sie können einen Page-Viewcontroller sowohl über Programmanweisungen als auch über ein Storyboard anlegen. Falls Sie den letztgenannten Weg wählen, müssen Sie dem Page-Viewcontroller jedoch nach der Erzeugung seine initialen Subviewcontroller per Programmcode zuweisen; außerdem ist in der Regel die Zuweisung des Delegates und der Datenquelle notwendig. Dabei ist die Datenquelle eine Controller-Komponente, die dem Page-Viewcontroller die Subviewcontroller für das Blättern zur Verfügung stellt.

Datenquellen

Eine Datenquelle ist eine Controller-Komponente, die Objekte für einen anderen Controller bereitstellt. Dabei fragt der Controller die Datenquelle immer nur nach den Daten, die er aktuell benötigt, und er überlässt die Verwaltung der Daten komplett der Datenquelle. Dieses Vorgehen hat den Vorteil, dass die Applikation nicht die kompletten Daten im Hauptspeicher halten muss. Der Controller kann also riesige Datenmengen bei verhältnismäßig geringem Speicherverbrauch anzeigen.

Bei der Konstruktion eines Page-Viewcontrollers legen Sie die Richtung und die Animation des Blätterns fest. Diese Werte können Sie später nicht mehr ändern. Als Animationstyp steht bis iOS 5 nur UIPageViewControllerTransitionStylePageCurl zur Verfügung, der ein Umblättern der Seiten simuliert. Ab iOS 6 gibt es außerdem den Typ UIPageViewControllerTransitionStyleScroll, der die Seiten von den Rändern her hineinschiebt.

Projektinformation

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

Mit dem Beispielprojekt Page, das Sie auf der beiliegenden DVD finden, können Sie die verschiedenen Einstellungen eines Page-Viewcontrollers ausprobieren. Es erzeugt den Controller über den in Listing 4.48 dargestellten Code.

UIPageViewControllerNavigationOrientation theOrientation = 
self.selectedNavigationOrientation;
UIPageViewControllerSpineLocation theLocation =
self.selectedSpineLocation;
BOOL isDoubleSided =
self.doubleSidedControl.selectedSegmentIndex;
NSDictionary *theOptions = @{
UIPageViewControllerOptionSpineLocationKey :
@(theLocation) };
UIPageViewController *theController =
[[UIPageViewController alloc] initWithTransitionStyle:
self.animationControl.selectedSegmentIndex
navigationOrientation:theOrientation
options:theOptions];
NSArray *theControllers =
[self viewControllersForSpineLocation:theLocation];

theController.doubleSided = isDoubleSided ||
theLocation == UIPageViewControllerSpineLocationMid;
theController.dataSource = self;
theController.delegate = self;
[theController setViewControllers:theControllers
direction:self.selectedDirection animated:YES
completion:NULL];

Listing 4.48 Erzeugen eines Page-Viewcontrollers

Die Bezugsposition für das Blättern übergeben Sie in einem Dictionary unter dem Schlüssel UIPageViewControllerOptionSpineLocationKey. Allerdings dürfen Sie bei der mittleren Blätterposition nur die doppelseitige Darstellung angeben. Außerdem müssen Sie die Viewcontroller setzen, die der Page-Viewcontroller nach seinem Erscheinen anzeigen soll. Auch hier ist die mittlere Blätterposition ein Sonderfall, da das Array hier zwei Viewcontroller enthalten muss. Für die anderen Positionen darf das Array hingegen immer nur ein Element enthalten. Die Werte für diese Konfigurationsoptionen fasst Tabelle 4.7 noch einmal zusammen.

Tabelle 4.7 Konfigurationsoptionen des Page-Viewcontrollers

Blätterposition Rückseitendarstellung Anzahl Viewcontroller

Minimum

Ein- und doppelseitig

1

Mitte

Doppelseitig

2

Maximum

Ein- und doppelseitig

1

Listing 4.48 verwendet eine Hilfsmethode, um die Viewcontroller für die Konstruktion zu erzeugen. Die Methode viewControllersForSpineLocation: liefert ein Array mit so vielen Viewcontrollern zurück, wie in Tabelle 4.7 angegeben sind. Dieses Array übergeben Sie über die Methode setViewControllers:direction:animated:completion: an den Page-Viewcontroller. Dabei sind die weiteren Parameter nur für bereits angezeigte Controller relevant. Über den Parameter animated legen Sie fest, dass die neuen Seiten durch ein Umblättern erscheinen. Die Richtung des Blätterns können Sie über den Parameter direction festlegen. Der letzte Parameter kann eine Blockfunktion enthalten, die der Controller nach Beendigung der Animation aufruft.


Rheinwerk Computing - Zum Seitenanfang

4.6.2Die Datenquelle und das DelegateZur vorigen Überschrift

Für das Blättern müssen Sie dem Page-Viewcontroller jeweils die benötigten Viewcontroller für die Seiten über eine Datenquelle mit dem Protokoll UIPageViewControllerDataSource bereitstellen. Es deklariert die zwei notwendigen Methoden pageViewController:viewControllerBeforeViewController: und pageViewController:viewControllerAfterViewController:, mit denen der Page-Viewcontroller jeweils auf die Vorgänger beziehungsweise Nachfolger eines Viewcontrollers zugreifen kann. Das Beispielprogramm verwendet für die Seiten einfach Viewcontroller, die eine Seitenzahl anzeigen. Die Methoden der Datenquelle erzeugen jeweils einen neuen Viewcontroller, bei dem die Seitennummer um eins niedriger beziehungsweise höher ist. Listing 4.49 enthält die Methode der Datenquelle zur Bestimmung des Vorgängers. Die Implementierung für die Bestimmung der Nachfolger ist dabei bis auf die vorletzte Zeile (+ anstatt –) gleich.

- (UIViewController *)pageViewController: 
(UIPageViewController *)inPageViewController
viewControllerBeforeViewController:
(UIViewController *)inViewController {
LabelViewController *theController =
(LabelViewController *)inViewController;
return [self labelViewControllerWithPageNumber:
theController.pageNumber – 1];
}

Listing 4.49 Erzeugung des Vorgängers in der Datenquelle

Der Viewcontroller für die Seiten stammt aus dem Storyboard, und die App erzeugt ein neues Objekt jeweils über die Methode instantiateViewControllerWithIdentifier:.

- (id)labelViewControllerWithPageNumber:(NSInteger)inPage {
LabelViewController *theController = [self.storyboard
instantiateViewControllerWithIdentifier:@"label"];
theController.pageNumber = inPage;
return theController;
}

Listing 4.50 Erzeugung eines Viewcontrollers aus dem Storyboard

Der Page-Viewcontroller kann bei einer Gerätedrehung die Blätterposition über die Delegate-Methode pageViewController:spineLocationForInterfaceOrientation: des Protokolls UIPageViewControllerDelegate ändern. Eine Änderung ist in der Regel bei der mittleren Blätterachse sinnvoll, da beispielsweise im Hochformat das horizontale Blättern zu zwei sehr schmalen Views führt. Wenn Sie die Blätterachse über diese Methode ändern, müssen Sie gegebenenfalls die Anzahl der Subviewcontroller im Page-Viewcontroller aktualisieren. In der Beispiel-App Page können Sie dieses Verhalten über den Schalter Update spine location on rotation beeinflussen, und die entsprechende Implementierung der Methode pageViewController:spineLocationForInterfaceOrientation: finden Sie in Listing 4.51:

- (UIPageViewControllerSpineLocation)pageViewController: 
(UIPageViewController *)inPageViewController
spineLocationForInterfaceOrientation:
(UIInterfaceOrientation)inOrientation {
UIPageViewControllerSpineLocation theLocation =
self.selectedSpineLocation;

if(self.updateLocationSwitch.on) {
BOOL isHorizontal =
self.selectedNavigationOrientation ==
UIPageViewControllerNavigationOrientationHorizontal;
NSArray *theControllers;

if(theLocation ==
UIPageViewControllerSpineLocationMid &&
UIInterfaceOrientationIsLandscape(inOrientation)
!= isHorizontal) {
theLocation =
UIPageViewControllerSpineLocationMin;
}
theControllers = [self
viewControllersForSpineLocation:theLocation];
[inPageViewController setViewControllers:
theControllers direction:self.selectedDirection
animated:YES completion:NULL];
}
return theLocation;
}

Listing 4.51 Berechnung der Blätterposition für die Viewrotation



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< 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.


[Rheinwerk Computing]

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


  Zum Katalog
Zum Katalog: Apps programmieren für iPhone und iPad






Apps programmieren für iPhone und iPad
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Apps programmieren für iPhone und iPad






Apps programmieren für iPhone und iPad


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


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo