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.8Regelbasierte Anpassung der OberflächeZur nächsten Überschrift

Die Tint-Color, die Apple mit iOS 7 eingeführt hat, eröffnet eine einfache Möglichkeit, die Vordergrundfarbe von Views einheitlich zu setzen. Damit können Sie beispielsweise bei vielen Views die Schriftfarbe und/oder Rahmenfarbe festlegen. Das konnten Sie zwar bisher auch schon, der Vorteil der Tint-Color liegt allerdings in ihrem Übertragungsmechanismus.

Tint-Color und andere Farbeinstellungen

Damit die Tint-Color auch zum Zuge kommt, dürfen Sie keine anderen Farben bei den Views setzen, die mit der Tint-Color kollidieren. Beispielsweise müssen Sie die Textfarbe eines Buttons im Interface Builder auf Default stellen, damit der Button seinen Text in der Tint-Color anzeigt.

Mit iOS 7 hat Apple das Verhalten einiger Viewklassen geändert, wenn sie bereits unter iOS 6 eine Property tintColor besaßen. Beispielsweise konnten Sie unter iOS 6 damit die Farbe der Navigationsleiste ändern; unter iOS 7 müssen Sie stattdessen dafür die Property barTintColor verwenden. Unter iOS 6 legt die Property tintColor der Klasse UIBarButtonItem die Hintergrundfarbe fest und unter iOS 7 die Farbe des Textes beziehungsweise des Icons.

Wenn Sie die Tint-Color eines Views explizit über seine Property tintColor setzen, erben automatisch seine Subviews, deren Subviews usw. diese Tint-Color. Das geht so lange, bis ein Subview eine neue Tint-Color festlegt. Abbildung 4.54 veranschaulicht dieses Prinzip: Der Hauptview 1 legt als Tint-Color die Farbe Rot fest, die der linke Subview 2 erbt und der rechte Subview 3 mit Blau überschreibt. Analog dazu verhalten sich die Subviews der Views 2 und 3: Sie erben (4 und 5) beziehungsweise überschreiben (6 und 7) die Tint-Color.

Abbildung

Abbildung 4.54 Erben und überschreiben der Tint-Color

Das Erben der Farben funktioniert auch, wenn die App die Tint-Color zur Laufzeit ändert. Abbildung 4.55 zeigt die Änderungen, wenn die App die Tint-Color von View 2 auf Magenta setzt; dann verwendet View 4 auch Magenta als Tint-Color. Das Löschen der Tint-Color von View 3 führt dazu, dass dieser View als auch der Subview 5 Rot als Tint-Color verwenden. Die Views 6 und 7 betreffen diese Änderungen nicht, da sie ja selbst ihre Tint-Color festlegen.

Abbildung

Abbildung 4.55 Aktualisierte Farbwerte nach Änderung der Tint-Color

Sie können übrigens die Tint-Color für alle Views im Storyboard über dessen Dateiinspektor festlegen (siehe Abbildung 4.56).

Abbildung

Abbildung 4.56 Auswahl der Tint-Color im Storyboard

Mit dieser Einstellung legen Sie explizit die Tint-Color des Programmfensters fest. Da die Klasse UIWindow eine Unterklasse von UIView ist, erbt sie deren Property tintColor, und Sie können darüber auch die globale Tint-Color per Programmcode setzen. Sie gelangen über die Property window von UIView an das Fenster, in dem sich der View befindet. Ein Viewcontroller kann beispielsweise folgendermaßen die globale Tint-Color setzen:

- (void)setGlobalTintColor:(UIColor *)inColor {
self.view.window.tintColor = inColor;
}

Listing 4.56 Ändern der globalen Tint-Color

Das funktioniert allerdings nur, wenn die App den View des Viewcontrollers anzeigt. Andere Möglichkeiten, an das Programmfester zu gelangen, sind die Propertys window des Application-Delegates und keyWindow des Application-Singletons.

Über die Property tintAdjustmentMode können Sie die Tint-Color zusätzlich und unabhängig von ihrem konkreten Farbwert abdunkeln; es gibt drei mögliche Werte:

Tabelle 4.8 Anpassungsmodi für die Tint-Color

Wert Beschreibung

UIViewTintAdjustmentModeAutomatic

Anpassungsmodus vom Superview erben

UIViewTintAdjustmentModeNormal

keine Anpassung; normale Darstellung

UIViewTintAdjustmentModeDimmed

abgedunkelte Darstellung

Bei einer impliziten oder expliziten Änderung der Tint-Color oder des Anpassungsmodus sendet Cocoa Touch die Nachricht tintColorDidChange an den View, die Sie bereits in Kapitel 3, »Sehen und Anfassen«, kennengelernt haben. Sinnvollerweise nutzen Sie diese Methode in der Regel dazu, das Neuzeichnen des Views über setNeedsDisplay anzustoßen.


Rheinwerk Computing - Zum Seitenanfang

4.8.1Gestaltungsregeln ...Zur nächsten ÜberschriftZur vorigen Überschrift

Neben den Möglichkeiten, die Oberfläche über direkte Änderungen der Views zu gestalten, bietet Cocoa Touch auch die Alternative, Regeln dafür festzulegen. Bisher haben Sie das Aussehen eines Views entweder über den Interface Builder und dessen Propertys beziehungsweise Methoden festgelegt. Mit diesem Vorgehen können Sie indes immer nur einen View auf einmal ändern. Bei der regelbasierten Oberflächengestaltung geben Sie, wie der Name schon vermuten lässt, Regeln an, um die Eigenschaften der Oberflächenelemente festzulegen.

Der Aufbau einer solchen Regel ist einfach und erfolgt über die Klasse, für die eine Einstellung gelten soll. Dabei können Sie die Einstellungen noch auf die Klassen der Superviews einschränken. Dieses System ist trotz seines simplen Aufbaus relativ mächtig. Das folgende Beispiel veranschaulicht dieses Regelsystem anhand einiger umgangssprachlicher Regeln:

  1. Alle Labels haben eine graue Schriftfarbe.
  2. Die Buttons in einer Navigationsleiste sind rot.
  3. Die Labels in einem Tableview sind blau, sofern sie nicht in einer Zelle liegen.

Diese Regeln lassen sich folgendermaßen umsetzen:

// Alle Labels haben eine graue Schriftfarbe
[[UILabel appearance] setTextColor:[UIColor darkGrayColor]];
// Die Buttons in einer Navigationsleiste sind rot.
[[UIBarButtonItem appearanceWhenContainedIn:
[UINavigationBar class], nil]
setTintColor:[UIColor redColor]];
// Die Labels in einem Tableview sind blau, sofern sie nicht
// in einer Zelle liegen.
[[UILabel appearanceWhenContainedIn:[UITableView class], nil]
setTextColor:[UIColor blueColor]];
[[UILabel appearanceWhenContainedIn:
[UITableViewCell class], [UITableView class], nil]
setTextColor:[UIColor darkGrayColor]];

Listing 4.57 Regeldefinitionen für die Oberflächengestaltung

Die Definition der Regeln erfolgt also über die Klassenmethoden appearance und appearanceWhenContainedIn:. Diese beiden Methoden liefern jeweils ein Objekt zurück, bei dem Sie die Einstellungen vornehmen, die Sie auch bei den entsprechenden Views anwenden möchten. Das Objekt nimmt den Methodenaufruf entgegen und sorgt für die Konfiguration der jeweiligen Views. Objekte, die Methodenaufrufe für andere Objekte entgegennehmen, nennt man auch Proxys. Für die erste Beispielregel greift die erste Anweisung in Listing 4.57 auf einen Proxy für Labels zu, um die Textfarbe zu setzen.

Die zweite Regel beschreibt die Farbe der Buttons in einer Navigationsleiste. Sie ist komplexer als die erste Regel, da sie nicht nur die Klasse der Zielobjekte enthält, sondern auch die Einschränkung, dass sich diese Objekte in einer Navigationsleiste befinden müssen. Diese Regel lässt sich über die Methode appearanceWhenContainedIn: beschreiben. Dabei gibt der Parameter eine Klasse an, in deren Views sich die Objekte befinden müssen, damit die Regel greift. Die zweite Anweisung in Listing 4.57 greift also auf ein Proxyobjekt für Buttons zu, das auf Navigationsleisten eingeschränkt ist.

Die dritte Beispielregel hat gegenüber der zweiten eine weitere Komplexitätsstufe, da sie auch die Einschränkung einschränkt. Regeln dieser Art lassen sich nur durch mehrere Anweisungen formulieren, indem Sie erst die Einschränkung und danach deren Einschränkungen beschreiben. Deshalb setzt die vorletzte Anweisung in Listing 4.57 die Textfarbe aller Labels auf Blau, und die letzte Anweisung ersetzt diese Regel innerhalb von Tabellenzellen durch eine neue Regel. Bei dieser Regel geben Sie zwei Klassen in der Parameterliste an, die die Hierarchie der Views widerspiegeln. Sie können aus der Anweisung direkt die umgangssprachliche Regel herleiten, indem Sie die Klassennamen folgendermaßen von links nach rechts lesen: Die Regel betrifft alle UILabels, die in einer UITableViewCell liegen, die in einem UITableView liegt.

Wenn Sie die Angabe der Klasse UITableView aus der letzten Anweisung weglassen, kommt diese Regel übrigens nicht mehr zum Zuge, und auch die Labels in den Zellen haben eine blaue Schrift. Das liegt daran, dass für Cocoa Touch die Regeln der beiden Anweisungen gleichwertig sind. Durch die zusätzliche Klassenangabe spezialisieren Sie die Regel in der letzten Anweisung stärker gegenüber der Regel in der vorletzten Anweisung.

Regeln zu Regeln

Für die Formulierung von Regeln gibt es ein paar Regeln:

  • Speziellere Regeln haben Vorrang vor einfacheren Regeln. Cocoa Touch wendet bei mehreren möglichen Regeln immer diejenige an, die die Klassen der View-Hierarchie am genauesten beschreibt.
  • Die Reihenfolge der Anweisungen, mit denen Sie Regeln definieren, hat keine Auswirkung auf deren Anwendung. Sie können also die Reihenfolge der Anweisungen in Listing 4.57 beliebig verändern. Das Ergebnis bleibt gleich.

Wenn Sie sich schon einmal mit der Webseitengestaltung über CSS-Anweisungen beschäftigt haben, kommt Ihnen dieses Konzept vielleicht bekannt vor. Auch dort beschreiben Sie das Aussehen der Elemente über Regeln, wobei speziellere Regeln einfachere überschreiben. Das Beispiel lässt sich wie in Listing 4.58 in HTML und CSS abbilden.

<html>
<head>
<style>
.label { color: #444444; }
.tableview .label { color: #0000FF; }
.tableview .cell .label { color: #444444; }
</style>
</head>
<body>
<label class="label">Label</label>
<div class="tableview">
<label class="label">Label in Tableview</label>
<div class="cell">
<label class="label">Label in Tableview-Zelle</label>
</div>
</div>
</body>
</html>

Listing 4.58 HTML-Seitengestaltung über CSS-Regeln

Die CSS-Regeldefinitionen befinden sich im style-Tag am Anfang des Listings. Bei diesen Definitionen müssen Sie die Klassen vor einer öffnenden, geschweiften Klammer jeweils von rechts nach links lesen. Die dritte Regel betrifft also alle Elemente mit der Klasse label, die sich in einem Element mit der Klasse cell befinden, das sich wiederum in einem Element mit der Klasse tableview befindet.


Rheinwerk Computing - Zum Seitenanfang

4.8.2... und GestaltungsmöglichkeitenZur vorigen Überschrift

Den Code aus Listing 4.57 finden Sie in der Methode application:didFinishLaunchingWithOptions: der Wecker-App im Ordner Apps/iOS6/AlarmClock. Durch diese Anweisungen sind beispielsweise die Abschnittsüberschriften im Einstellungsdialog blau. Die Farbe dieser Elemente können Sie allerdings nicht über den Interface Builder setzen, und so erlaubt Ihnen die regelbasierte Oberflächengestaltung die Anpassung von Elementen, auf die Sie keinen direkten Zugriff haben. Das kann ein Segen sein, wie bei den Abschnittsüberschriften. Andererseits führen die Regeln manchmal auch zu unerwünschten Änderungen.

Die Beispiele haben bislang nur die Farbe von Elementen verändert. Sie können indes nahezu beliebige Einstellungen der Views damit verändern. Die Methoden zum Lesen und Schreiben der Einstellung müssen dabei nur einen festen Aufbau haben. Dabei kann die eigentliche Einstellung laut Dokumentation einen der folgenden Typen haben: id oder eine Klasse, NSInteger, NSUInteger, CGFloat, CGPoint, CGSize, CGRect, UIEdgeInsets oder UIOffset. Die Accessoren auf diese Einstellungen dürfen auch weitere Parameter entgegennehmen, wenn diese ganze Zahlen sind. Hierzu ein paar Beispiele:

  • Die Propertys backgroundColor, textColor, tintColor, image und backgroundImage können Sie verwenden, weil der Typ dieser Einstellungen jeweils eine Klasse ist. Sie können auch die Propertys textAlignment, bounds, frame, lineBreakMode über Regeln setzen, weil ihre Typen in der Liste oben auftreten. Die Ganzzahltypen NSInteger und NSUInteger decken dabei übrigens auch Aufzählungstypen wie UITextAlignment ab.
  • Die zustandsabhängigen Eigenschaften eines Buttons wie beispielsweise setTitleColor:(UIColor*)forState:(UIControlState) lassen sich auch über Regeln setzen, da der Typ des ersten Parameters eine Klasse und der Typ des zweiten Parameters ein Aufzählungs-, also ein Ganzzahltyp ist. Sie können auch die Methode setBackgroundImage:(UIImage*)forState:(UIControlState)barMetrics:(UIBarMetrics) verwenden, da auch hier der erste Parametertyp eine Klasse ist und alle weiteren Parameter Ganzzahltypen haben.
  • Ein Gegenbeispiel sind die Property transform und die Methode setFinishedSelectedImage:(UIImage*)withFinishedUnselectedImage:(UIImage*) der Klasse UITabBarItem. Die Property scheidet aus, weil sie die C-Struktur CGAffineTransform als Typ hat, den die obige Liste nicht enthält. Bei der Methode ist der Typ des zweiten Parameters ebenfalls eine Klasse und kein Ganzzahltyp, weswegen Sie sie auch nicht verwenden können.

Diese Beispiele sind sehr unvollständig. Sie können über zwei Verfahren ermitteln, ob sich eine Eigenschaft über Regeln anpassen lässt. Zum einen können Sie sich die Deklaration der Property beziehungsweise der Methode in der Headerdatei ansehen. Das geht am einfachsten, indem Sie mit der Maus auf den Namen klicken und dabei die Taste cmd drücken. Dann springt Xcode zur Deklaration des angeklickten Symbols. Alle Propertys oder Methoden, die sich über Regeln konfigurieren lassen, enthalten das Makro UI_APPEARANCE_SELECTOR am Ende. Allerdings können Sie aus dem Fehlen des Makros nicht darauf schließen, dass diese Einstellung sich nicht über Regeln setzen lässt.

Aus diesem Grund gibt es ein weiteres, zuverlässigeres Verfahren. Probieren Sie es aus, indem Sie eine entsprechende Anweisung in Ihren Code einfügen. Entweder akzeptiert Cocoa Touch den Aufruf, oder das Programm stürzt mit der Meldung ab:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '*** Illegal property type, XXX in invocation selector, YYY'

Sie können über Regeln sogar die Einstellungen Ihrer eigenen Klassen verändern. Beispiel: Die Farbe des Ziffernblattes der Wecker-App soll sich in der Version für iOS 5 über die Property dialColor von außen setzen lassen. Dazu fügen Sie in den Header der Klasse ClockView die Property-Deklaration ein:

@property (nonatomic, strong) UIColor *dialColor;

Außerdem müssen Sie den Anfang der drawRect:-Methode ändern. Dort ersetzen Sie den bisherigen Funktionsaufruf zum Setzen der Füllfarbe durch den Aufruf der Methode setFill bei der neuen Property. setFill legt die Füllfarbe im aktuellen Grafikkontext fest. Listing 4.59 zeigt den Ausschnitt mit der Änderung aus der Methode:

CGContextSaveGState(theContext);
[self.dialColor
setFill];
CGContextAddEllipseInRect(theContext, theBounds);
CGContextFillPath(theContext);

Listing 4.59 Setzen der Ziffernblattfarbe über eine Property

Wenn Sie nun die Wecker-App starten, zeigt sie ein schwarzes Ziffernblatt mit grauer Beschriftung. Das liegt daran, dass Sie noch keine Füllfarbe festgelegt haben. Fügen Sie jetzt in die Methode application:didFinishLaunchingWithOptions: des App-Delegates die Anweisung

[[ClockView appearance] setDialColor:[UIColor whiteColor]];

ein, und importieren Sie dort auch die Headerdatei ClockView.h des Ziffernblattes, um Übersetzungsfehler zu vermeiden. Durch diese Änderung zeigt der Wecker wieder ein weißes Ziffernblatt an.



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