Letzte Woche ließ Apple also endlich die Katze aus dem Sack: Auf seinem Oktober-Event stellte das Unternehmen zwei neue MacBook Pro-Modelle mit 14- und 16-Zoll-Bildschirm vor. Und die Maschinen haben es (soweit wenigstens auf dem Papier) mehr als in sich: Die neuen M1 Pro- und M1 Max-Prozessoren scheinen nur so vor Power zu strotzen, ehemals verdrängte Anschlüsse sind wieder da (hallo MagSafe, hallo HDMI!) und die Touch Bar hat ausgedient (ob man letzteres nun gut oder schlecht findet, bleibt wohl jedem selbst überlassen). Dazu kommt ein neues Display, das nun ähnlich wie bei iPhone und iPad einen deutlich schmaleren Rand…
Das AVFoundation-Framework ermöglicht es mit überschaubarem Aufwand, einen QR-Code-Scanner auf Basis eines eigenen View-Controllers umzusetzen. Im Zuge eines aktuellen Projekts habe ich genau einen solchen benötigt und – das möchte ich an dieser Stelle nicht verschweigen – eine enorm hilfreiche Vorlage bei Hacking with Swift gefunden (siehe Links am Ende des Artikels). Diese Vorlage habe ich lediglich leicht abgewandelt und um einen zusätzlichen Delegate ergänzt (dazu gleich mehr). An dieser Stelle findet ihr bereits einmal den Code des QRCodeScannerViewController: Sobald die View lädt beziehungsweise erscheint, baut sie eine Session zur Videoaufzeichnung und Erkennung von QR-Codes auf. Der Delegate-Callback des AVCaptureMetadataOutputObjectsDelegate…
Text Selection Neben der Eingabe von Text ist es in manchen Fällen erwünscht, den Nutzer Text aus der eigenen App auswählen zu lassen. Nach der Text-Selektierung könnte man dann passende Optionen anbieten, beispielsweise das Kopieren des Inhalts in die Zwischenablage oder das anderweitige Teilen des gewählten Textes. Bei Views wie Text war solch eine Selektierung bis dato nicht möglich. Das hat sich nun mit der neuesten SwiftUI-Version und Xcode 13 geändert. So ermöglicht es der neue textSelection(_:)-Modifier, Textinhalte in einer App auszuwählen. Zu diesem Zweck erwartet der Modifier eine Instanz, die zum TextSelectability-Protokoll konform ist. Zur Auswahl stehen aktuell die…
Neue Style-Deklarationen Eine kleine aber nicht minder feine Anpassung hat die neueste SwiftUI-Version in Bezug auf Style-Deklarationen zu bieten. Generell bieten verschiedene Views in SwiftUI wie Button oder List die Möglichkeit, ihr Aussehen mittels Style anzupassen. Diese Styles sind in der Regel konform zu einem spezifischen Protokoll. Um sie zu verwenden, ruft man zunächst den passenden Style-Modifier auf der gewünschten View auf und übergibt im Anschluss eine Instanz des gewünschten Style-Typs. Möchte man beispielsweise das Aussehen eines Pickers als Segmented-Control festlegen, würde man folgenden Modifier auf der gewünschten Picker-Instanz aufrufen: .pickerStyle(SegmentedPickerStyle()) Diese zugegebenermaßen nicht allzu schöne Syntax hat Apple nun…
Task.sleep Im ersten Teil dieser Artikelreihe haben wir den grundlegenden Einsatz der beiden neuen Swift-Schlüsselwörter async und await kennengelernt. Ergänzend möchte ich in diesem Beitrag ein konkretes Beispiel zeigen, das den Einsatz von Concurrency in Swift demonstriert. Grundlage für dieses Beispiel ist eine praktische Funktion namens Task.sleep(_:). Sie ist ideal, um die korrekte Funktionalität von asynchronem Code zu testen. Sie pausiert die Ausführung der nachfolgenden Befehle für den Zeitraum, den man als Parameter übergibt. Diesen Zeitraum definiert man hierbei in Nanosekunden. Soll die Ausführung also beispielsweise für zwei Sekunden angehalten werden, ruft man den folgenden Befehl auf: await Task.sleep(2 *…
Swipe Actions Eines der Highlights in der neuesten SwiftUI-Version stellen Swipe Actions dar. Hierbei handelt es sich um Aktionen, die nach einer Wischgeste über eine Zelle zum Vorschein kommen. Man kennt diese Aktionen bereits aus vielen Apps, beispielsweise Mail. Wischt man in der Listenansicht von rechts nach links über eine Nachricht, erscheint ein Button mit Papierkorb-Grafik, der das Löschen der gewählten E-Mail ermöglicht. Mithilfe des neuen swipeActions(edge:allowsFullSwipe:content:)-Modifiers kann man nun selbst auf simple Art und Weise solche Aktionen in eigenen Listen integrieren. Um das zu tun, definiert man über den content-Parameter die Views, die als ausführbare Aktionen nach einer Wischgeste…
Separator-Anpassungen Mit Xcode 13 halten auch neue Konfigurationsmöglichkeiten in iOS/iPadOS 15 Einzug, die es ermöglichen, das Erscheinungsbild von Trennlinien in Listen anzupassen. So erlaubt es der neue listRowSeparatorTint(_:edges:)-Modifier, eine eigene Farbe für eine Trennlinie festzulegen. Man ruft den Modifier direkt auf der Zelle auf, deren Trennlinie man anpassen möchte. Das nachfolgende Listing zeigt ein Beispiel. Möchte man gänzlich auf die Darstellung von Trennlinien verzichten, kann man zu diesem Zweck nun den neuen listRowSeparator(_:edges:)-Modifier verwenden. Der erwartet als ersten Parameter eine Instanz vom Enumeration-Typ Visibility. Übergibt man die Option hidden, blendet man eine Trennlinie vollständig aus. Fazit Die neuen Modifier zum…
AsyncImage Mit Xcode 13 steht uns in SwiftUI eine neue View namens AsyncImage zur Verfügung. Die ermöglicht es, ein Bild auf Basis einer URL asynchron zu laden. Das Bild wird automatisch angezeigt, sobald der Download erfolgreich abgeschlossen wurde. Um eine AsyncImage-Instanz zu erzeugen, braucht es wenigstens die URL zum gewünschten Bild, wie der folgende Aufruf zeigt: AsyncImage kann aber noch mehr. Beispielsweise lässt sich eine Skalierung des geladenen Bildes mithilfe des scale-Parameters festlegen. Das ist für hochauflösende Bilder spannend, die man im Code beispielsweise mit dem @2x-Suffix versehen würde: Bildkonfiguration und Platzhalter Da AsyncImage eine ganz eigene View im SwiftUI-Framework…
refreshable-Modifier Auf der WWDC 2021 stellte Apple einige spannende Neuerungen in Bezug auf das SwiftUI-Framework vor. Auch wenn es sich bei diesen Neuerungen primär um kleinere Ergänzungen handelt, tragen die mit Sicherheit doch einen großen Teil dazu bei, die App-Entwicklung mit SwiftUI weiter zu verbessern und uns Entwicklern den Alltag ein wenig zu erleichtern. Eine dieser spannenden Ergänzungen ist der neue refreshable(_:)-Modifier. Er lässt sich auf scrollbare Elemente wie Listen anwenden und ergänzt diese um eine Pull-to-Refresh-Geste. Diese Geste ist bereits seit langem in iOS etabliert und dient dazu, neue Daten zu laden oder bestehende zu aktualisieren. Der refreshable(_:)-Modifier nimmt…
async/await-Basics Die kommende Version 5.5 von Swift ist Teil von Xcode 13 und wird eine große Neuerung in der Programmiersprache mit sich bringen. Mithilfe der neuen Schlüsselwörter async und await lassen sich nun endlich asynchrone Befehle ausführen, ohne auf entsprechende Funktionen des Dispatch-Frameworks zurückgreifen zu müssen. Das Grundprinzip hinter den neuen Swift-Schlüsselwörtern async und await ist denkbar simpel. Mit async kann man Funktionen deklarieren und so festlegen, dass diese asynchron ablaufen. Während die Funktion also ihre Befehle abarbeitet, kann die zugrundeliegende App von anderer Stelle weitere Befehle entgegennehmen und ausführen. Möchte man eine mittels async deklarierte Funktion nutzen, muss man…