iOS SDK Anpassung des UIKit-Themes

Die Anpassung von Motiven ist eine großartige Möglichkeit, sich im App Store hervorzuheben, ist jedoch nicht immer leicht zu erreichen. In diesem Lernprogramm erfahren Sie einige grundlegende Tricks zur Anpassung von UIKit, mit deren Hilfe Sie Ihre Anwendungen besser unterscheiden und unvergessliche Benutzererlebnisse schaffen können.


Überblick

Wenn Sie sich im iOS Dev Center mit der Online-Dokumentation von Apple beschäftigt haben, sind Sie mit den berüchtigten Human Interface Guidelines (gelegentlich als "HIG" bezeichnet) vertraut. In diesem Dokument erhalten Entwickler und Designer von iOS-Anwendungen Richtlinien, wie Benutzer mit Apps auf der iOS-Plattform interagieren sollen. Außerdem finden Sie allgemeine Verwendungsbeispiele und allgemeine UI / UX-Prinzipien.

Es gibt viele Möglichkeiten, das Erscheinungsbild Ihrer eigenen iOS-App anzupassen - durch Ändern der Farben und Größen durch das Rollen Ihrer eigenen Benutzeroberflächenelemente. Es wird jedoch als bewährte Methode angesehen, dem HIG und seinen Vorschlägen zu folgen, um eine übersichtliche, benutzbare Oberfläche bereitzustellen.

Sehen wir uns einige Möglichkeiten an, wie wir genau dies tun können, während wir unsere Benutzeroberfläche an ein einzigartiges visuelles Thema anpassen.


Ein Foto-Viewer

Die meisten iOS-Entwickler sind mit den gängigen Attributen der UIView-Klasse vertraut, die sich leicht ändern lassen, z. B. Hintergrundfarbe, Schriftgröße oder Deckkraft. Aber manchmal bringt uns das Anpassen dieser Eigenschaften einfach nicht zu dem Ergebnis, das wir brauchen.

Um weitere praktische Anpassungsverfahren zu demonstrieren, arbeiten wir an einer einfachen Foto-Viewer-App. So sieht die App ohne Anpassungen aus und dann mit den Änderungen, die wir vornehmen:

Bevor wir loslegen, benötigen Sie ein paar Bilder, die Sie hier herunterladen können.

Ich habe auch die Basisanwendung, die wir verwenden werden, eingerichtet, die Sie hier herunterladen können. Sie müssen sich nicht um die gesamte Vorbereitungsarbeit kümmern. Lass uns einfach mit dem Anpassen beginnen!


UIViews und ihre visuellen Eigenschaften

Mit unserer Prep-App haben wir einige grundlegende Komponenten:

  • UINavigationBar (Variable: aNavigationBar)
  • UIImageView (Variable: anImageView)
  • UILabel (Variable: aLabel)
  • UISegmentedControl (Variable: aSegmentControl)

Wir beginnen damit, dass unser Hintergrund durch das Festlegen eines Hintergrundbildes ein wenig eleganter wird. Fügen Sie dazu in unserer Klasse "MTViewController" eine Methode mit dem Namen "-setupUI" hinzu..

Wir fügen diese Methode direkt unter unseren @synthesize-Deklarationen hinzu.

 - (ungültig) setupUI 

Jetzt müssen wir unsere Hintergrundbilddatei zu unserem Projekt hinzufügen. Laden Sie die Datei "BG-pattern.png" aus den Ressourcen herunter, die Sie vor einer Minute heruntergeladen haben, und ziehen Sie sie in unsere App. Ich habe eine neue Gruppe für unsere UI-Images mit dem Namen "UI Graphics" erstellt..

Wenn das Bild vorhanden ist, können wir in diese "setupUI" -Methode einsteigen und müssen nur eine Zeile hinzufügen:

 [self.view setBackgroundColor: [UIColor colorWithPatternImage: [UIImage imageNamed: @ "BG-pattern.png"]]];

Um diese Änderung live in unserer App vornehmen zu können, müssen wir unsere "setupUI" -Methode von der "viewDidLoad" -Methode unseres ViewControllers aufrufen. Ich habe der "viewDidLoad" -Methode bereits einige Aufrufe hinzugefügt, so dass wir diese am Anfang hinzufügen können:

 - (void) viewDidLoad // Benutzerdefinierte UI-Elemente einrichten [self setupUI]; // Arrays für Bilder und Titel erstellen [self setupData]; // App mit dem ersten ausgewählten Segment starten [self didChangeSegmentControl: aSegmentControl]; [super viewDidLoad]; // Nehmen Sie nach dem Laden der Ansicht weitere Einstellungen vor, normalerweise von einer Spitze. 

Lassen Sie uns unser Bild ein wenig hervorheben, indem Sie einen weißen Rand hinzufügen. Dazu arbeiten wir mit CALayers zusammen. Das bedeutet, dass wir zunächst das QuartzCore-Framework in unser Projekt integrieren müssen.

Gehen Sie also zu unserem UIKitDemo-Projekt und wir wählen unser Ziel (UIKitDemo). Dann gehen wir zum Tab "Build Phases" und zeigen den Abschnitt "Link Binary With Libraries".

Unten klicken wir auf die Schaltfläche "+" und wählen "QuartzCore.framework"..

Endlich müssen wir #einführen Quarz in unseren ViewController (MTViewController.m).

 #einführen 

Wenn Quartz installiert ist, können wir mit den anImageView-Sublayern herumspielen. Wir fügen unserer "setupUI" -Methode Folgendes hinzu, um den Rahmen um unsere ImageView hinzuzufügen:

 [anImageView.layer setBorderWidth: 5.0f]; [anImageView.layer setBorderColor: [[UIColor whiteColor] CGColor]];

Wenn wir jetzt unsere App erstellen und ausführen, sehen wir einen ordentlichen, weißen Rand um unsere ImageView.

Um unser Image noch mehr hervorzuheben, können wir mit ähnlichen Methoden einen subtilen Schatten hinter sich lassen:

 [anImageView.layer setShadowRadius: 5.0f]; [anImageView.layer setShadowOpacity: .85f]; [anImageView.layer setShadowOffset: CGSizeMake (1.0f, 2.0f)]; [anImageView.layer setShadowColor: [[UIColor blackColor] CGColor]]; [anImageView.layer setShouldRasterize: YES]; [anImageView.layer setMasksToBounds: NO];

Einige dieser Befehle sind in ihrer Funktion nicht sofort ersichtlich, daher werden wir uns diese Zeile für Zeile ansehen:

 [anImageView.layer setShadowRadius: 5.0f];

Wir beginnen damit, die Menge an "Unschärfe" festzulegen, die unser Schatten haben wird.

 [anImageView.layer setShadowOffset: CGSizeMake (1.0f, 2.0f)];

Als Nächstes erstellen wir einen Versatz für unseren Schatten, sodass er nicht direkt hinter unserem Bild liegt.

 [anImageView.layer setShouldRasterize: YES];

Dieser Befehl hilft bei der Leistung, da er sicherstellt, dass der Schatten nur einmal gezeichnet und dann als Bitmap gespeichert wird. Dadurch muss die App die prozessorintensive transparente Ebene nicht neu zeichnen.

 [anImageView.layer setMasksToBounds: NO];

Schließlich möchten wir sicherstellen, dass wir unseren Schatten nicht abschneiden, da er sich über die Grenzen unserer ursprünglichen Sicht hinaus ausbreitet.

Starten Sie die App erneut, und Sie sehen einen schönen Schatten hinter unserem Image.

Wir haben viele harte Kanten. Lassen Sie uns also unsere Oberfläche abmildern, indem wir für unser UILabel (aLabel) abgerundete Ecken haben.

Wir können dies in derselben "setupUI" -Methode unter den UIImageView-Anpassungen tun. Alles, was wir brauchen, ist eine einfache Zeile, um dies zu erreichen

 [aLabel.layer setCornerRadius: 15.0f];

Durch die letzte Änderung unserer "setupUI" -Methode wird nun unser UIImageView leicht gedreht, wodurch das "quadratische" Gefühl des restlichen Layouts unterbrochen wird.

Wir können dies mit zwei weiteren Zeilen am Ende unserer Methode "setupUI" tun:

 CGAffineTransform-Transformation = CGAffineTransformMakeRotation (.03f); anImageView.transform = transform;

Und das wars für unsere "setupUI". Nicht schlecht für ein paar Zeilen Code, richtig?


UIKit-Anpassung

Mit der Veröffentlichung von iOS 5 wurde ein neues Protokoll für die Unterklassen von UIViews eingeführt, das als "Schein" bezeichnet wird. Mit diesem Protokoll können wir bestimmte Aspekte unserer Standard-UIKit-Komponenten nach Belieben anpassen, z. B. benutzerdefinierte Hintergrundbilder, Schatten, Farbeffekte und mehr.

Ein einfaches Beispiel dafür ist die UINavigationBar. Wir können jetzt benutzerdefinierte Bilder einstellen, um unsere UINavigationBars problemlos an die Themen unserer App anzupassen:

 [[UINavigationBar-Darstellung] setBackgroundImage: navBarImage forBarMetrics: UIBarMetricsDefault];

In diesem Fall haben wir eine UIImage namens "navBarImage", die wir als Standardbild für unsere UINavigationBar festlegen. Der Aufruf "Aussehen" wirkt sich auf unsere UINavigationBar-Klasse aus, nicht nur auf eine einzelne Instanz. Dies bedeutet, dass unsere Änderungen auf alle in dieser App verwendeten UINavigationBars angewendet werden.

Um diese Änderung in unserem aktuellen Photo Viewer-Projekt zu implementieren, müssen Sie zu unserer AppDelegate-Klasse (MTAppDelegate) wechseln. Wir gehen zur AppDelegate, weil unsere Änderung alle Instanzen von UINavigationBars in unserer App betreffen soll. Um sicherzustellen, dass unsere Änderungen vorgenommen werden, implementieren wir sie sofort nach dem Öffnen der App.

Beginnen wir mit dem Hinzufügen der Methode zu unserer Klasse "MTAppDelegate" direkt nach unserer @ synthetisieren Deklarationen, genau wie in unserer Klasse "MTViewController":

 - (ungültig) setupUI 

Jetzt importieren wir unser Bild "navBar.png" (aus dem zuvor heruntergeladenen Bildressourcenordner)..

Wir können dann die UIImage-Instanz erstellen, die wir für unseren Hintergrund verwenden werden:

 UIImage * navBarImage = [UIImage imageNamed: @ "navBar.png"];

Und gleich danach können wir unseren "Auftritt" nennen:

 [[UINavigationBar-Darstellung] setBackgroundImage: navBarImage forBarMetrics: UIBarMetricsDefault];

Bevor diese Änderung jedoch aktiv ist, müssen wir unsere "setupUI" -Methode vom aufrufen Anwendung: didFinishLaunchingWithOptions: Methode.

 - (BOOL) Anwendung: (UIApplication *) Anwendung didFinishLaunchingWithOptions: (NSDictionary *) launchOptions [self setupUI];…

Sie können Ihre App jetzt ausführen. Beachten Sie den dunklen Hintergrund in unserer App UINavigationBar oben.

Bei unserem nächsten Trick werden die Dinge etwas komplizierter. Wir werden benutzerdefinierte Bilder für unser UISegmentedControl festlegen. Das Schwierige dabei ist, dass es sich nicht nur um ein oder zwei Hintergrundbilder handelt, sondern dass wir mit bestimmten Bildausschnitten arbeiten müssen. wie die abgerundeten Enden, ausgewählte oder nicht ausgewählte mittlere Abschnitte, die Trennlinie zwischen zwei Segmenten usw.

Importieren Sie, falls noch nicht geschehen, zunächst die verbleibenden Bilder im heruntergeladenen Bildressourcenordner.

Genau wie bei der UINavigationBar, die wir vor einer Minute geändert haben, müssen wir zwei Dinge tun, um unser UISegmentedControl zu ändern.

  1. Erstellen Sie die UIImages für unsere Hintergründe
  2. Wende die UIImages für ihre jeweiligen Zustände an

Ich habe nicht genug Zeit, um jede dieser Aktionen Schritt für Schritt abzubauen, aber ich werde mich in einer Minute mit den wichtigsten befassen. Hängen Sie zunächst den folgenden Code an Ihre Methode "setupUI" an:

 UIImage * segmentSelected = [[UIImage imageNamed: @ "segcontrol_sel.png"] resizableImageWithCapInsets: UIEdgeInsetsMake (0, 15, 0, 15)]; UIImage * segmentUnselected = [[UIImage imageNamed: @ "segcontrol_uns.png"] resizableImageWithCapInsets: UIEdgeInsetsMake (0, 15, 0, 15)]; UIImage * segmentSelectedUnselected = [UIImage imageNamed: @ "segcontrol_sel-uns.png"]; UIImage * segUnselectedSelected = [UIImage imageNamed: @ "segcontrol_uns-sel.png"]; UIImage * segmentUnselectedUnselected = [UIImage imageNamed: @ "segcontrol_uns-uns.png"];

Dies erstellt unsere UIImages und führt bei Bedarf eine Größenänderung durch. Sie werden dieses kleine bisschen bemerken:

 resizableImageWithCapInsets: UIEdgeInsetsMake (0, 15, 0, 15)

Dies ermöglicht es uns, unsere Bilddatei im Wesentlichen "zuzuschneiden", indem sie um bestimmte Ränder hinein geschnitten wird. In diesem Fall belassen wir die Oberseite so, wie sie ist, bewegen uns 15 Punkte von der linken Seite, lassen die Unterseite unverändert und 15 Punkte von der rechten Seite. So bleibt der Mittelteil, der sich auf die erforderliche Breite ausdehnen wird, aber die abgerundeten Enden bleiben gleich und biegen unsere gestreckte Mitte.

Weitere Informationen zu "resizableImageWithCapInsets:" finden Sie in der offiziellen Apple-Dokumentation.

Mit unseren Bildern können Sie die verschiedenen Zustände unserer UISegmentedControl einstellen. Jedes der fünf Bilder, die wir gerade hinzugefügt haben, hat einen entsprechenden Status:

 [[UISegmentedControl-Darstellung] setBackgroundImage: segmentUngewählt fürState: UIControlStateNormal barMetrics: UIBarMetricsDefault]; [[UISegmentedControl-Darstellung] setBackgroundImage: segmentSelected fürState: UIControlStateSelected barMetrics: UIBarMetricsDefault]; [[UISegmentedControl-Darstellung] setDividerImage: segmentUnselectedUnselected fürLeftSegmentState: UIControlStateNormal rightSegmentState: UIControlStateNormal barMetrics: UIBarMetricsDefault]; [[Erscheinungsbild von UISegmentedControl] setDividerImage: segmentSelectedUnselected forLeftSegmentState: UIControlStateSelected rightSegmentState: UIControlStateNormal barMetrics: UIBarMetricsDefault]; [[Erscheinungsbild von UISegmentedControl] setDividerImage: segUnselectedSelected forLeftSegmentState: UIControlStateNormal rightSegmentState: UIControlStateSelected barMetrics: UIBarMetricsDefault];

Im Gegensatz zu einem einfachen UIButton, der entweder ausgewählt ist oder nicht, kann unser UISegmentedControl auch überprüfen, auf welcher Seite sich das aktuelle Segment befindet, aber es ist nicht zu komplex, wenn wir den Dreh raus haben.


Fazit

Mit den neuen Funktionen von iOS 5 und einigen kreativen Arbeiten mit Quartz können wir unsere Apps schnell und einfach nach Belieben anzeigen lassen. Einige Herausforderungen, die sich bei der Anpassung der Benutzeroberfläche bieten, sind:

  1. Gute Grafiken finden, die leicht zu manipulieren sind.
  2. Stellen Sie sicher, dass Sie sich auf die Benutzererfahrung konzentrieren.

Es kann relativ leicht sein, gute Grafiken zu finden, und es gibt viele gute Designer, die bereit sind zu helfen. Es kann manchmal schwieriger sein, den Fokus auf das "Warum" und nicht nur auf das "Wie" der Benutzeroberflächenanpassung zu behalten. Um den fiktiven Dr. Ian Malcolm in zu zitieren Jurassic Park:

[Sie] waren so sehr mit der Frage beschäftigt, ob sie könnten, dass sie nicht aufhörten zu denken, wenn sie sollten.

Gehen Sie wie immer nach draußen, probieren Sie neue Dinge aus, passen Sie die Einstellungen an und erkunden Sie die vielen anderen Möglichkeiten, wie Sie Ihre iOS-Benutzeroberflächen anpassen können!