In dem vorherigen Tutorial habe ich einige neue Funktionen von iOS 7 erläutert, mit denen Sie subtile Animationen und größere Interaktivität mit überraschend wenig Code hinzufügen können, um reale Physik zu simulieren. In diesem Tutorial zeige ich Ihnen, wie Sie auf einer Suchergebnisseite ein ausgeblendetes Formular erstellen.
Wir verwenden ein Schwerkraftverhalten und ein Kollisionsverhalten, um zu steuern, ob das Formular aktuell sichtbar ist oder nicht. Wir erhalten auch eine subtile Bounce-Animation, sobald das Panel angezeigt wird. Lass uns anfangen.
Öffnen Sie Xcode und wählen Sie Neu> Projekt… von dem Datei Speisekarte. Wählen Einzelansicht-Anwendung aus der Liste von iOS-Anwendung Vorlagen und klicken Sie auf Nächster.
Geben Sie einen Namen für Ihr Projekt ein, ich habe meinen angerufen Dynamik. Geben Sie den Namen, die Unternehmenskennung und das Klassenpräfix Ihrer Organisation ein. Wählen iPhone von dem Geräte Klicken Sie auf Nächster, und wählen Sie einen Ort zum Speichern des Projekts.
Öffnen Hauptplatine und löschen Sie den View Controller, der standardmäßig vorhanden ist.
Ziehen Sie eine Navigationssteuerung von dem Objektbibliothek. Bei Xcode 5 ist der Root-View-Controller des Navigationscontrollers standardmäßig a UITableViewController
Beispiel. Wählen Sie den Table View-Controller aus und löschen Sie ihn. Wir erstellen für dieses Projekt einen benutzerdefinierten Ansichts-Controller.
Ziehen Sie eine Controller anzeigen von dem Objektbibliothek und positionieren Sie es links von der Navigationssteuerung. Klicken Sie mit der rechten Maustaste auf den Navigationscontroller, um das anzuzeigen Verbindungsinspektor. Klicken Sie auf das Plus links von Root-View-Controller und wählen Sie den soeben hinzugefügten View-Controller.
Wählen Sie das Navigationselement des View-Controllers aus und ändern Sie den Titel in Suchergebnisse in dem Attribute-Inspektor zur Rechten.
Erstellen Sie das Projekt, und führen Sie es aus, um sicherzustellen, dass die Ansichten und Ansichtscontroller ordnungsgemäß angeschlossen sind.
Öffnen Sie in der Header-Datei des View-Controllers den Project Navigator. Füge hinzu ein UITableView
Eigenschaft, a UIView
Eigenschaft für die Formularansicht, a UIBarButtonItem
für die Schaltfläche, um das Formular anzuzeigen, und a UIButton
das Formular ausblenden. Fügen Sie eine Aktion für das hinzu UIBarButtonItem
sowie eine Aktion für die UIButton
.
Die View Controller-Klasse muss ebenfalls der entsprechen UITableViewDataSource
und UITableViewDelegate
Protokolle. Die Header-Datei des View-Controllers sollte jetzt so aussehen:
#einführen@Interface ViewController: UIViewController @ property (nichtatomisch, schwach) IBOutlet UITableView * tableView; @ property (nichtatomisch, schwach) IBOutlet UIView * filterFormView; @ property (nichtatomisch, schwach) IBOutlet UIBarButtonItem * filterButton; @ property (nichtatomisch, schwach) IBOutlet UIButton * applyFilterButton; - (IBAction) filterButtonTapped; - (IBAction) applyFilterButtonTapped; @Ende
Bearbeiten Sie in der Implementierungsdatei des View-Controllers die viewDidLoad
Methode. Nach dem [super viewDidLoad]
, sag dem UITableView
Beispiel für die Verwendung der UITableViewCell
Klasse, die sich selbst bevölkern soll:
[self.tableView registerClass: [UITableViewCell-Klasse] forCellReuseIdentifier: @ "Cell"];
Als nächstes implementieren Sie die UITableViewDataSource
Protokoll in der Implementierungsdatei des View-Controllers. Die Tabelle sollte einen Abschnitt mit 100 Zeilen enthalten, und in jeder Zeile sollte die Zeilennummer der Zelle angezeigt werden.
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView return 1; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) Abschnitt return 100; - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: @ "Cell"]; cell.textLabel.text = [NSString stringWithFormat: @ "% ld", (long) indexPath.row]; zurück Zelle;
Erneut besuchen Hauptplatine und wählen Sie den zuvor hinzugefügten View-Controller aus. Ändern Sie die Klasse in ViewController
in dem Identitätsinspektor damit wir die zuvor geschaffenen Verkaufsstellen verbinden können.
Ziehen Sie eine UITableView
Beispiel aus dem Objektbibliothek in der Ansicht des View Controllers. Stellen Sie sicher, dass die Tabellenansicht oben auf dem View Controller platziert ist und diese vollständig abdeckt. Verwenden Sie die Verbindungsinspektor um den View-Controller als Tabellenansicht festzulegen Datenquelle und delegieren.
Erstellen Sie Ihre Anwendung und führen Sie sie aus. Sie sollten eine Tabelle mit 100 Zeilen sehen, die jeweils die Zeilennummer enthält.
Im Hauptplatine ziehen Sie ein UIView
Instanz an den View Controller. Stellen Sie sicher, dass die Ansicht nicht als Kopf der Tabellenansicht hinzugefügt wird. Sie können dies überprüfen, indem Sie das öffnen Dokument Gliederung auf der linken Seite und prüfen, ob die soeben hinzugefügte Ansicht ein Peer der Tabellenansicht ist, keine Unteransicht.
Setzen Sie die Hintergrundfarbe der Ansicht auf ein hellgrau, den Ursprung auf (0,0, 0,0)
, und seine Größe zu (320,0, 568,0)
so dass es den gesamten Bildschirm ausfüllt und die Tabellenansicht abdeckt.
Verbinden Sie diese Ansicht mit der filterFormView
Steckdose, die wir in der Header-Datei des View-Controllers deklariert haben.
Fügen Sie der Ansicht einige Steuerelemente hinzu. Stellen Sie sich vor, es handelt sich um ein Formular zum Filtern der in der Tabellenansicht angezeigten Suchergebnisse. Fügen Sie eine Reihe von Textfeldern und eine Schaltfläche hinzu (siehe Abbildung unten).
Verbinden Sie das Sich bewerben Taste mit der applyFilterButton
Steckdose haben wir früher erklärt und verbinden die Touch Up Inside Veranstaltung zum applyFilterButtonTapped
Aktion.
Besuchen Sie die Implementierungsdatei des View-Controllers erneut und fügen Sie eine leere Methodendeklaration für hinzu applyFilterButtonTapped
damit die Anwendung nicht abstürzt, wenn Sie versehentlich auf die Schaltfläche tippen.
- (void) applyFilterButtonTapped
Erstellen Sie Ihre Anwendung und führen Sie sie aus. Sie sollten das Formular sehen, das die Tabellenansicht abdeckt.
Füge hinzu ein UIBarButtonItem
Instanz zur Navigationsleiste. Ändern Sie den Titel in Filter und verbinden Sie es mit dem filterButton
Ausgang, den wir in der Header-Datei des View-Controllers deklariert haben. Verbinden Sie das filterButtonTapped
Aktion zum filterButton
Bar-Button-Element.
Wechseln Sie zurück zur Implementierungsdatei des View-Controllers und fügen Sie eine leere Methodendeklaration für hinzu filterButtonTapped
damit die Anwendung nicht abstürzt, wenn Sie auf das Element der Bar-Schaltfläche tippen.
- (void) filterButtonTapped
Bevor wir dynamisches Verhalten hinzufügen, sollten Sie sich einen Moment Zeit nehmen, um darüber nachzudenken, was wir tun sollen und wie wir es erreichen können.
Wenn das Filterformular nicht sichtbar ist, sollte es außerhalb des Bildschirms liegen. Wir können eine verwenden UIGravityBehavior
nach oben zu wirken, damit es nicht herunterfällt. Wenn der Filter Wenn die Taste gedrückt wird, sollte die Schwerkraft nach unten wirken, wodurch die Form in Sicht kommt.
Wir brauchen auch eine UICollisionBehavior
mit Grenzen, so dass das Formular so weit ansteigt, dass es sich außerhalb des Bildschirms befindet und nur bis zum unteren Rand des Bildschirms reicht. Der nächste Screenshot zeigt die beiden Endzustände des Formulars, wobei die rosa Linien die Kollisionsgrenzen anzeigen. Lassen Sie uns das in Code übersetzen.
Im ViewController.h a erklären UIDynamicAnimator
Eigentum. Wir werden unser Verhalten an diesen Animator übergeben, der bestimmt, was mit der Formularansicht geschehen muss. Deklarieren Sie a UIGravityBehavior
und ein UICollisionBehavior
.
@ property (nonatomic, strong) UIDynamicAnimator * -Animateur; @ Eigenschaft (nichtatomar, stark) UIGravityBehavior * Schwerkraft; @ property (nonatomic, strong) UICollisionBehavior * -Kollision;
Im viewDidLoad
, initialisieren Animator
als dynamischer Animator mit der Ansicht des View-Controllers als Referenzansicht. Als nächstes initialisieren Schwere
und konfigurieren Sie es so, dass es mit einem Winkel von nach oben wirkt -M_PI_2
auf der filterForm
Aussicht.
Es ist jetzt Zeit, die View Controller zu initialisieren Kollision
Eigenschaft durch Aufruf initWithItems:
und ein Array nur mit übergeben self.filterForm
drin. Wir fügen zwei Begrenzungen hinzu, eine am unteren Rand der Ansicht und eine am oberen Rand der Ansicht. So wird die aktualisierte Implementierung von viewDidLoad
sieht aus wie:
- (void) viewDidLoad [super viewDidLoad]; [self.tableView registerClass: [UITableViewCell-Klasse] forCellReuseIdentifier: @ "Cell"]; self.animator = [[UIDynamicAnimator-Zuordnung] initWithReferenceView: self.view]; self.gravity = [[UIGravityBehavior-Zuordnung] initWithItems: @ [self.filterFormView]]; self.gravity.angle = -M_PI_2; [self.animator addBehavior: self.gravity]; self.collision = [[UICollisionBehavior-Zuordnung] initWithItems: @ [self.filterFormView]]; [self.collision addBoundaryWithIdentifier: @ "TopOfView" vonPoint: CGPointMake (0., -self.filterFormView.bounds.size.height) anPoint: CGPointMake (self.view.bounds.size.width, -self.filterFormView.bounds.size .Höhe)]; [self.collision addBoundaryWithIdentifier: @ "BottomOfView" vonPoint: CGPointMake (0., self.view.bounds.size.height) nachPoint: CGPointMake (self.view.bounds.size.width, self.view.bounds.size.height )]; [self.animator addBehavior: self.collision];
Wenn Sie auf die Filter-Schaltfläche tippen, möchten wir die Schaltfläche deaktivieren, um den Benutzer nicht zu verwirren. Außerdem möchten wir, dass die Schwerkraft nach unten wirkt, damit das Formular sichtbar wird. Aktualisieren Sie die filterButtonTapped
Aktion wie folgt:
Wenn der Sich bewerben Wenn Sie auf die Schaltfläche in der Formularansicht tippen, möchten Sie, dass die Schwerkraft wieder nach oben wirkt, um sicherzustellen, dass das Formular vom Bildschirm abrutscht. Wir ermöglichen auch die Filter Taste erneut. Aktualisieren Sie die applyFilterButtonTapped
Aktion wie folgt:
- (void) applyFilterButtonTapped self.gravity.angle = -M_PI_2; self.filterButton.enabled = YES;
Bevor wir das Projekt zum letzten Mal erstellen und ausführen, verschieben wir das Filterformular außerhalb des Bildschirms, sodass Benutzer die Formularrutsche nicht sehen können, wenn die Anwendung gestartet wird. Stellen Sie das ein y
Position für die Filterformularansicht auf -568
.
Erstellen Sie die Anwendung und führen Sie sie aus. Tippen Sie auf die Filter Taste und das Formular sollte in Sicht kommen und mit einem sanften Sprung einrasten. Tippen Sie auf die Sich bewerben Klicken Sie auf die Schaltfläche und sehen Sie, wie das Formular wieder reibungslos aus dem Bildschirm verschoben wird.
Die Einrichtung der Benutzeroberfläche hat etwas Arbeit gekostet, aber nachdem wir das getan hatten, war es ein Kinderspiel, eine auf Physik basierende Animation hinzuzufügen. Es dauerte nur ein paar Zeilen Code.
Wir mussten nicht programmieren, wie die Physik funktioniert, wie zum Beispiel der Absprung. Dank UIKit Dynamics mussten wir nur angeben, welche Verhaltensweisen wir wollten, und das lassen UIDynamicAnimator
Objekt machen die Arbeit für uns.