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

Inhaltsverzeichnis
Geleitwort des Gutachters
Vorwort
1 Einführung
2 Einstieg in die Praxis
3 Aufwachen – analoger Wecker
4 Daten, Tabellen und Controller
5 Animationen und Layer
6 Programmieren, aber sicher
7 Jahrmarkt der Nützlichkeiten
A Die Buch-DVD
Stichwort

Download:
- ZIP, ca. 23,6 MB
Buch bestellen
Ihre Meinung?

Spacer
Apps entwickeln für iPhone und iPad von Klaus M. Rodewig, Clemens Wagner
Das Praxisbuch
Buch: Apps entwickeln für iPhone und iPad

Apps entwickeln für iPhone und iPad
geb., mit DVD
515 S., 34,90 Euro
Galileo Computing
ISBN 978-3-8362-1463-6
Pfeil 4 Daten, Tabellen und Controller
Pfeil 4.1 Benachrichtigungen
Pfeil 4.1.1 Benachrichtigungen empfangen
Pfeil 4.1.2 Eigene Benachrichtigungen verschicken
Pfeil 4.2 Core Data
Pfeil 4.2.1 Datenmodellierung
Pfeil 4.2.2 Implementierung von Entitätstypen
Pfeil 4.2.3 Einbindung von Core Data
Pfeil 4.2.4 Der Objektkontext
Pfeil 4.2.5 Die Nachrichten des Objektkontexts
Pfeil 4.2.6 Anlegen und Ändern von Entitäten in der Praxis
Pfeil 4.3 View-Rotationen
Pfeil 4.3.1 Flexible Views dank der Autoresizingmask
Pfeil 4.3.2 Lang lebe das Rotationsprinzip
Pfeil 4.3.3 Anpassung des Layouts
Pfeil 4.4 Texte, Bilder und Töne verwalten
Pfeil 4.4.1 Die Tastatur betritt die Bühne
Pfeil 4.4.2 Fotos aufnehmen
Pfeil 4.4.3 Töne aufnehmen und abspielen
Pfeil 4.5 Tableviews und Core Data
Pfeil 4.5.1 Tableviews
Pfeil 4.5.2 Tabellenzellen gestalten
Pfeil 4.5.3 Buttons in Tabellenzellen
Pfeil 4.5.4 Zellen löschen
Pfeil 4.5.5 Core Data II: Die Rückkehr der Objekte
Pfeil 4.5.6 Prädikate
Pfeil 4.5.7 Aktualisierung des Tableviews
Pfeil 4.5.8 Das Delegate des Fetchedresultscontrollers
Pfeil 4.5.9 Tabelleneinträge suchen
Pfeil 4.6 Containerviewcontroller
Pfeil 4.6.1 Der Navigationcontroller
Pfeil 4.6.2 Splitviewcontroller
Pfeil 4.6.3 Der Pageviewcontroller
Pfeil 4.6.4 Subview- und Containerviewcontroller

Galileo Computing - Zum Seitenanfang

4.3 View-RotationenZur nächsten Überschrift

Zu den faszinierenden Neuerungen des iPhones gegenüber seinen Konkurrenzprodukten gehört sicherlich auch die Möglichkeit, das Gerät sowohl im Hoch- als auch im Querformat verwenden zu können. Sie drehen das iPhone um 90°, und die Bildschirmanzeige passt sich der neuen Ausrichtung automatisch an. Dabei gibt es Apps, wie beispielsweise Safari, die einfach nur das Layout anpassen, oder wie den Rechner, der im Hochformat einen einfachen und im Querformat einen wissenschaftlichen Rechner anzeigt (siehe Abbildung 4.6).

Abbildung

Abbildung 4.6 Anpassung der Anzeige im Rechner

Das Fototagebuch soll seine Views auch automatisch an die Ausrichtung des Gerätes anpassen. Dazu müssen Sie aber keine Rotationen berechnen oder unterschiedliche Layouts verwalten. Es reicht aus, wenn Sie Ihre Views größenunabhängig gestalten. Dabei hilft Ihnen die Autoresizingmask.


Galileo Computing - Zum Seitenanfang

4.3.1 Flexible Views dank der AutoresizingmaskZur nächsten ÜberschriftZur vorigen Überschrift

Jeder View besitzt eine eigene Autoresizingmask. Sie besteht aus sechs booleschen Werten, die zu einer Bitmaske verknüpft sind. Die booleschen Werte stehen dabei für die Veränderlichkeit – entweder für einen Abstand zu den vier Seiten des umliegenden Views oder für die Breite beziehungsweise Höhe des Views.

Abbildung

Abbildung 4.7 Die Autoresizingmask und das Beispiel im Größeninspektor des Interface Builders

Sie können die Maske über den Größeninspektor im Interface Builder, der Ihnen auch ein animiertes Beispiel anzeigt (siehe Abbildung 4.7), oder über die Property autoresizingMask im Code anpassen. Während die Anpassung im Code einheitlich ist – Sie setzen jeweils das Bit für die Größen, die flexibel sein sollen –, ist die Einstellung im Interface Builder für die Ränder im Gegensatz zu Breite und Höhe vertauscht. Sie müssen dort den roten Strich für ein Randelement selektieren, wenn es unveränderlich sein soll, und Sie müssen es deselektieren, falls Sie es flexibel haben wollen. Bei der Breite und der Höhe ist es genau umgekehrt. Dort bedeutet ein selektierter Strich, dass die Größe flexibel ist, und ein deselektierter, dass die Größe fest ist. Sie können die Maske aus der Abbildung also folgendermaßen im Programmcode setzen:

theView.autoresizingMask = UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleBottomMargin;

Listing 4.14 Setzen der Autoresizingmask im Programmcode

Tipp

Nutzen Sie die Beispielansicht im Interface Builder, wenn Sie sich unsicher sind, wie Sie die Autoresizingmask für Ihre Anforderungen einstellen müssen. Die Animation verdeutlicht sehr schön, wie sich der View bei einer Größenänderung verhält.

Die Einstellungen in der Autoresizingmask eines Views werden immer dann wirksam, wenn die Größe des Superviews verändert wird. Wenn die Maske für eine Größe festlegt, dass sie unveränderlich ist, hat diese Größe nach der Änderung den gleichen Wert wie davor. Definiert die Maske den Wert hingegen als veränderlich, so wird die Größe dynamisch angepasst.

Die folgenden Beispiele sollen das Verhalten veranschaulichen:

  • Wenn Sie einem View eine flexible Breite und Höhe geben, hat der View immer den gleichen Abstand zu den Rändern seines Superviews. Sie können mit dieser Maske beispielsweise Rahmen mit einer festen Breite realisieren. Wenn Sie eine neue XIB-Datei anlegen, bekommt der darin enthaltene View diese Maske, damit sich dessen Größe bei einer Rotation automatisch anpassen kann.
  • Wenn Sie Textfelder, Labels und Buttons im Interface Builder anlegen, bekommen diese einen flexiblen rechten und unteren Rand. Bei einer Größenveränderung des Superviews ändern sie also ihre Position zum linken und oberen Rand nicht. Das ist sinnvoll, da es allgemein üblich ist, Formulare von oben links her aufzubauen.
  • Formulare zeigen in der Regel die Buttons zum Absenden oder Ablehnen am unteren Rand an. Hier müssen Sie also den oberen Rand flexibel und den unteren unveränderlich setzen.
  • Tabbars und Werkzeugleisten liegen am unteren Bildschirmrand und nehmen dessen komplette Breite ein. Sie müssen bei diesen Elementen also einen flexiblen oberen Rand und eine flexible Breite setzen, so wie es der Interface Builder bei diesen Elementen auch macht.
Tipp

Sie sollten Ihre Views möglichst so gestalten, dass sie flexibel auf Größenveränderungen reagieren. Zum einen kann der View in der App eine andere Größe als im Interface Builder haben, und zum anderen ist das die beste Voraussetzung, um dessen Rotationsfähigkeit sicherzustellen.

Sie sollten sich außerdem beim Anlegen eines Views nicht auf feste Displaygrößen verlassen. Momentan haben alle iPhone- und iPod-Touch-Displays eine Größe von 320 × 480 Punkten, was entweder der Pixelzahl oder auf Retinadisplays 640 × 960 Pixeln entspricht. Es gibt aber keine Garantie dafür, dass das immer so bleibt.

Die Autoresizingmask ist eine relativ einfache, aber effektive Methode, um Views größenunabhängig gestalten zu können. Sie kann aber natürlich nicht alle Möglichkeiten abdecken. Beispielsweise sollte beim analogen Wecker das Zifferblatt möglichst immer quadratisch sein. Das lässt sich durch die Autoresizingmask aber nicht ausdrücken, sondern nur über Programmcode.

Die Klasse UIView stellt jedoch Methoden bereit, mit denen Sie ein beliebiges Layout umsetzen können. Dabei bestimmt jeweils der Superview die Position und Größe seiner Subviews. Sie können das verändern, indem Sie die Methode layoutSubviews überschreiben und darin die Subviews über deren Property frame so positionieren, wie Sie es wünschen. Das iOS ruft diese Methode auf, sobald der View ein neues Layout benötigt. Sie sollten diese Methode niemals direkt aufrufen. Falls Sie das Layout eines Views neu berechnen möchten, sollten Sie stattdessen setNeedsLayout verwenden. Der nächste Abschnitt behandelt ein Beispiel für einen View mit eigenem Layout.


Galileo Computing - Zum Seitenanfang

4.3.2 Lang lebe das RotationsprinzipZur nächsten ÜberschriftZur vorigen Überschrift

Das Prinzip hinter der Rotation aus der Perspektive der App ist erstaunlich einfach, da es nur auf der Größenveränderung des dargestellten Views beruht. Die Verwaltung und die Darstellung der Rotation übernimmt das iOS für Sie. Sie brauchen also Ihren View nur größenunabhängig aufzubauen, um ihn rotationsfähig zu machen.

Abbildung

Abbildung 4.8 Layoutanpassung bei Rotation über die Autoresizingmask

Sie können dafür in vielen Fällen die Autoresizingmask verwenden, wenn die Größe

  • sich durch die Rotation nicht verändern soll oder
  • nur von der entsprechenden Größe des umgebenden Views in der gleichen Dimension abhängt.

Sie können also beispielsweise die Breite des Views über die Autoresizingmask dynamisch anpassen, wenn die neue Breite nach der Rotation nur von der neuen Breite des Superviews abhängt. In Abbildung 4.8 ist ein Beispiel für eine solche Rotationsanpassung mit festen und variablen Größenänderungen dargestellt. Dabei bedeuten die weißen Punkte, dass der entsprechende Randwert in der Maske fixiert ist; und die gestrichelten Pfeile bedeuten, dass der entsprechende Größenwert in der Maske flexibel ist.

Größenanpassungen im Interface Builder

Sie können Ihre Einstellungen der Autoresizingmask im Interface Builder überprüfen, indem Sie den Attributinspektor des obersten Views öffnen. Dort befindet sich das Dropdownmenü Orientation, mit dem Sie die Ausrichtung des Views verändern können. Sie können dort auch in der Rubrik Simulated Metrics verschiedene System-UI-Elemente konfigurieren, um die verfügbare Fläche des Views anzupassen. Die Einstellungen, die Sie dort vornehmen, haben aber keinen Einfluss auf Ihr Programm. Aber auch, wenn Ihr View keine Rotation unterstützen soll, ist es immer eine gute Idee, dessen Flexibilität über dieses Dropdownmenü zu testen. Sie können damit recht einfach herausfinden, ob sich Ihr View richtig an neue Größen anpasst.

Dieses Beispiel finden Sie auch als Projekt Rotation auf der beiliegenden DVD. Wenn Sie die App im Simulator starten und diesen über die Menüpunkte Hardware · Links drehen (CMD + Links) beziehungsweise Hardware · Rechts drehen (CMD + Rechts) drehen, rotiert der View mit. Das liegt daran, dass Sie Cocoa Touch noch nicht mitgeteilt haben, welche Ausrichtungen Ihr View unterstützt. Das können Sie über die Methode shouldAutorotateToInterfaceOrientation: des Viewcontrollers festlegen. Sie bekommt vom iOS die gewünschte Ausrichtung als Parameter übergeben und liefert YES zurück, wenn der View, den der Controller verwaltet, diese Ausrichtung unterstützt. Für die Ausrichtungen gibt es den Aufzählungstyp UIInterfaceOrientation, und Sie können den Parameter mit den entsprechenden Konstanten dieses Typs vergleichen. Wenn Sie beispielsweise nur Querformate unterstützen möchten, können Sie die Methode so implementieren:

- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)inOrientation {
return
inOrientation == UIInterfaceOrientationLandscapeLeft ||
inOrientation == UIInterfaceOrientationLandscapeRight;
}

Listing 4.15 Unterstützung unterschiedlicher Geräteausrichtungen

Wenn Sie alle Ausrichtungen unterstützen möchten, können Sie natürlich einfach YES zurückgeben. Falls Sie sowohl Portrait- als auch Landscapeausrichtungen unterstützen möchten, stellt Cocoa Touch Ihnen die beiden Makros UIInterfaceOrientationIsPortrait() und UIInterfaceOrientationIsLandscpe() zur Verfügung. Mit Letzterem können Sie die return-Anweisung in Listing 4.15 auch einfacher und klarer formulieren:

return UIInterfaceOrientationIsLandscape(inOrientation);

In dem Beispielprogramm Rotation können Sie die Rotationsunterstützung über das Segmented Control oben rechts im View ein- und ausschalten.

Sie sollten in dieser Methode aber keine andere Funktionalität implementieren, und Sie sollten auch nicht annehmen, dass Cocoa Touch bei einer Rückgabe von YES auch diese Ausrichtung verwendet. Diese Methode ist nur für die Entscheidung da, welche Ausrichtungen Ihr Viewcontroller unterstützt. Wenn Ihr Viewcontroller den Beginn oder das Ende einer Rotation mitbekommen soll, sollten Sie dafür lieber die Methoden willRotateToInterfaceOrientation:duration: und didRotateFromInterfaceOrientation: überschreiben.

Die aktuelle Ausrichtung des Viewcontrollers können Sie über die Property interfaceOrientation auslesen. Dieser Wert entspricht dabei der Anzeige- und nicht der Geräteausrichtung. Das sind zwei unterschiedliche Werte, da ja die Anzeigeausrichtung nicht der Geräteausrichtung entsprechen muss. Wenn Ihr Viewcontroller beispielsweise nur das Hochformat unterstützt, bleibt die Anzeigeausrichtung immer gleich, egal wie Sie das Gerät drehen.

Die Geräteausrichtung können Sie über das Singleton UIDevice und die Property orientation ermitteln. Die Device-Klasse verwendet zwar andere Konstanten, die für das Querformat auch noch vertauschte Bezeichnungen – Links ist das neue Rechts – haben. Sie können aber die Rückgabewerte der beiden Propertys trotzdem miteinander vergleichen, da die UIInterfaceOrientation-Konstanten über die Device-Konstanten definiert sind.

Achtung

Wenn Sie die zulässige Ausrichtung des Viewcontrollers von der aktuellen Ausrichtung des Gerätes abhängig machen möchten, dürfen Sie in shouldAutorotateToInterfaceOrientation: nicht die Property interfaceOrientation des Viewcontrollers verwenden. Diese Property liefert Ihnen nicht die Ausrichtung des Gerätes, sondern die des Viewcontrollers. Ihre Verwendung kann an dieser Stelle zu einer Endlosrekursion führen. Wenn Sie die Geräteausrichtung ermitteln möchten, sollten Sie immer die Property orientation der Klasse UIDevice verwenden.


Galileo Computing - Zum Seitenanfang

4.3.3 Anpassung des LayoutsZur vorigen Überschrift

Der View des Itemviewcontrollers des Fototagebuchs passt sich bei der Rotation des Gerätes an dessen Ausrichtung an. Er stellt im Hochformat das Foto über dem Text dar. Das Querformat ordnet beide Elemente nebeneinander an. Dieses Verhalten können Sie nicht über die Autoresizingmask erreichen. Dazu verwendet das Programm eine eigene Unterklasse RotationView von UIView, die die Methode layoutSubviews überscheibt.

Dieser View passt bei einer Rotation nur die Koordinaten seines zweiten Subviews an. Dafür verwendet das Programm einen Hilfsview, den Abbildung 4.9 als graue Fläche darstellt. Der Textview passt sein Layout über die Autoresizingmask an und hat feste Abstände zu den Rändern seines Superviews und eine flexible Breite und Höhe.

Abbildung

Abbildung 4.9 Automatische Layoutanpasung

Der Rotation-View muss zwei Fälle unterscheiden. In der vertikalen Ansicht ordnet er den Hilfsview unter dem Bild an, wobei dieser die volle Breite einnimmt. In der horizontalen Ansicht weist er dem Hilfsview hingegen die volle Höhe zu und ordnet ihn neben dem Bild an. Die Methode unterscheidet zwischen Hoch- und Querformat, indem sie die Breite ihres Views mit dessen Höhe vergleicht.

- (void)layoutSubviews {
[super layoutSubviews];
CGRect theFrame = self.frame;
CGRect theFirstFrame =
[[self.subviews objectAtIndex:0] frame];
UIView *theSecondView = [self.subviews objectAtIndex:1];
CGRect theSecondFrame = theSecondView.frame;

if(CGRectGetWidth(theFrame) < CGRectGetHeight(theFrame)) {
theSecondFrame.origin.x = 0.0;
theSecondFrame.origin.y = CGRectGetMaxY(theFirstFrame);
theSecondFrame.size.width = CGRectGetWidth(theFrame);
theSecondFrame.size.height = CGRectGetHeight(theFrame) –
CGRectGetMaxY(theFirstFrame);
}
else {
theSecondFrame.origin.x = CGRectGetMaxX(theFirstFrame);
theSecondFrame.origin.y = 0.0;
theSecondFrame.size.width = CGRectGetWidth(theFrame) –
CGRectGetMaxX(theFirstFrame);
theSecondFrame.size.height = CGRectGetHeight(theFrame);
}
theSecondView.frame = theSecondFrame;
}

Listing 4.16 Berechnung des Layouts für die Rotationsanpassung

Die komplette Methode für das Layout stellt Listing 4.16 dar. Sie können die Methode layoutSubviews der Klasse UIView immer überschreiben, wenn Sie das Layout Ihrer Views über Ihren Programmcode anpassen möchten. Sie sollten das aber nur machen, wenn das automatische Layout über die Autoresizingmask dafür nicht ausreicht.

Cocoa Touch ruft diese Methode auf, wenn eine Neuanordnung Ihrer Views notwendig ist. Wie bereits erwähnt wurde, sollten Sie diese Methode aber niemals direkt aufrufen, sondern durch einen Aufruf der Methode setNeedsLayout Ihren View für einen Aufruf markieren. Alternativ können Sie auch durch einen Aufruf von layoutIfNeeded ein sofortiges Anordnen Ihrer Views erzwingen.

Tipp

Sie können durch einen eigenen View, der die Methode layoutSubviews überschreibt, Ihre Views beliebig an die Geräteausrichtung anpassen. Dabei können Sie nicht nur die Anordnung der Subviews anpassen, sondern sie auch anzeigen oder verstecken lassen. Sie sollten allerdings keine Steuerungslogik (z. B. zum Laden von Daten) in diese Methode legen. Dafür ist die Controllerschicht zuständig.



Ihr Kommentar

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







<< zurück
  Zum Katalog
Zum Katalog: Apps entwickeln für iPhone und iPad





Apps entwickeln für iPhone und iPad
Jetzt bestellen


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

 Buchempfehlungen
Objective-C 2.0 & Cocoa





 Objective-C 2.0
 Cocoa


Zum Katalog: Mac OS X Lion






 Mac OS X Lion


Zum Katalog: Mac OS X und UNIX






 Mac OS X
 und UNIX


Zum Katalog: Android 3






 Android 3


Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: CSS






 CSS


Zum Katalog: jQuery






 jQuery


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2011
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.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de