RSS Use Your Loaf - iOS-Entwic... Notiz

Notizfaden

CdXz5zHNQW_5ZPzFJEMHm.png
Swift 6.2 führt einen neuen Typ namens Observations ein, um Zustandsänderungen von Observable-Typen zu streamen. Dies ist nützlich, um den Zustand von Anwendungen zu speichern, wie z. B. die Suchanfrage und den Navigationspfad einer Szene. Der Autor verwaltete diesen Zustand zuvor in einer Codable-Klasse namens SceneModel, die zur Speicherung in JSON kodiert werden konnte.Diese SceneModel wurde dann mithilfe von @SceneStorage in der Root-Ansicht gespeichert und wiederhergestellt. Das Speichern des Zustands beruhte jedoch auf der Überwachung der scenePhase, was unzuverlässig war, da Szenen beendet werden konnten, bevor sie in den Hintergrund wechselten. Vor Swift 6.2 ermöglichte ObservableObject mit @Published-Eigenschaften die Verwendung von Combine's buffer und values, um eine AsyncSequence zum Speichern von Zustandsänderungen zu erstellen.Mit iOS 26 und Swift 6.2 bietet der Observations-Typ eine ähnliche AsyncSequence für Observable-Typen. Dies ermöglicht die Beobachtung berechneter Eigenschaften, wie z. B. der JSON-Darstellung der SceneModel. Der Observations-Typ nimmt einen Closure entgegen, der den zu beobachtenden Wert zurückgibt.Änderungen sind transaktional, was bedeutet, dass mehrere synchrone Updates an beobachtbaren Eigenschaften zu einem einzigen Sequenzwert zusammengefasst werden. Die Nachverfolgung von Updates beginnt mit dem willSet von beobachtbaren Eigenschaften und endet am nächsten Aufhängepunkt. Dies ermöglicht das automatische Speichern des Zustands des Szenenmodells, wann immer es sich ändert, ohne auf die scenePhase angewiesen zu sein. Die AsyncSequence von Observations gibt den anfänglichen Wert der beobachteten Eigenschaft beim Abonnieren aus.
Apple führte TipKit in iOS 17 ein, um Nutzern kontextbezogene Tipps anzuzeigen und verfolgt dabei die Häufigkeit der Tipps und Steuerungsereignisse. In iOS 18 können Sie den TipKit-Zustand mithilfe von CloudKit synchronisieren, um zu vermeiden, dass auf jedem Gerät dieselben Tipps angezeigt werden. Um die CloudKit-Synchronisierung zu aktivieren, wählen Sie Ihr App-Ziel in Xcode aus, fügen Sie die iCloud-Funktion hinzu und wählen Sie CloudKit. Fügen Sie dann eine Container-ID hinzu, die auf „.tips“ endet, und aktivieren Sie die Funktion „Hintergrundmodi“ mit „Remote-Benachrichtigungen“. TipKit synchronisiert standardmäßig nicht mit CloudKit, daher müssen Sie den CloudKit-Container bei der Konfiguration des Tipps-Datenspeichers aktivieren. Sie können die Option „.automatic“ verwenden oder eine spezifische ID übergeben, um den CloudKit-Container zu konfigurieren. Seien Sie vorsichtig, wenn Sie eine Core Data/SwiftData-Datenbank mit CloudKit synchronisieren, da möglicherweise die falsche Container-ID verwendet wird. Apple empfiehlt, einen separaten Container für die Synchronisierung von Tipps zu verwenden. Sie können Ihre Core Data/SwiftData-ID zuerst in der Entitlements-Datei auflisten oder sie explizit festlegen, bevor Sie den persistenten Speicher laden. Die Synchronisierung von TipKit mit CloudKit wurde auf der WWDC24 vorgestellt. Zusätzlich ist ein Buch über Modern Auto Layout während des WWDC25-Verkaufs zu einem reduzierten Preis erhältlich.
CdXz5zHNQW_StQr2PuKiZ.png
Der Artikel behandelt das Erstellen benutzerdefinierter SwiftUI Button- und Label-Stile, darunter ein adaptiver Label-Stil, der bei kompakten horizontalen Größenklassen auf ein vertikales Layout umschaltet, und ein benutzerdefinierter Kapsel-Button-Stil mit einer gefüllten gelben Kapsel und einer Schriftart mit fester Breite. Diese Stile können Ansichten mit den Modifikatoren .labelStyle und .buttonStyle angewendet werden. Es ist jedoch weniger üblich, Convenience-Erweiterungen für LabelStyle oder ButtonStyle zu erstellen, die eine kompaktere Form des Modifikators ermöglichen würden. Um dies zu erreichen, schlägt der Artikel vor, ButtonStyle und LabelStyle zu erweitern, ähnlich wie Apple integrierte Stile definiert. Dies beinhaltet das Hinzufügen einer statischen Eigenschaft oder Funktion zur Erweiterung, die eine Instanz des benutzerdefinierten Stils zurückgibt. Beispielsweise kann der Kapsel-Button-Stil mit einer statischen Eigenschaft capsule erweitert werden, die eine CapsuleButtonStyle-Instanz zurückgibt. Dies ermöglicht die Anwendung des Stils mit der kompakten Form .buttonStyle(.capsule). Wenn der benutzerdefinierte Stil Parameter hat, z. B. eine konfigurierbare Farbe, kann die Erweiterung so modifiziert werden, dass sie eine Funktion enthält, die den Parameter entgegennimmt und eine Instanz des benutzerdefinierten Stils zurückgibt. Dies ermöglicht die Anwendung des Stils mit dem Parameter, z. B. .buttonStyle(.capsule(.orange)). Der Artikel enthält Beispiele dafür, wie ButtonStyle und LabelStyle erweitert werden können, um komfortable benutzerdefinierte Stile zu erstellen.
"Beim Erstellen einer Sprachlern-App mit SwiftUI kann es vorkommen, dass VoiceOver Text nicht korrekt ausspricht, wenn er sich in einer anderen Sprache als der Gerätestandort befindet. Um dies zu beheben, müssen Sie die von VoiceOver verwendete Sprache für die Barrierefreiheit ändern. In UIKit können Sie die Eigenschaft accessibilityLanguage für Text-Labels festlegen, aber dies ist in SwiftUI nicht verfügbar. Eine vorgeschlagene Lösung besteht darin, AttributedString mit dem Attribut accessibilitySpeechLanguage zu verwenden, aber das funktioniert nicht. Eine andere Lösung besteht darin, die Umgebung für das Gebietsschema für jede Ansicht mithilfe des environment-Modifikators zu ändern. Dies funktioniert jedoch nur, wenn Sie den verbatim-Initialisierer für die Text-Ansicht verwenden, da der Text standardmäßig als lokalisierter Zeichenketten-Schlüssel behandelt wird. Diese Lösung funktioniert für Text-Ansichten, erfordert aber eine längere Form für Ansichten wie Label. Sie können das Gebietsschema auf das Label oder die Kind-Textansicht anwenden, aber wenn Sie ein Label mit einem Symbol verwenden, wird das Gebietsschema nur dann wirksam, wenn es auf den Button angewendet wird. Das bedeutet, dass VoiceOver "Button" im geänderten Gebietsschema ausspricht, der Haupttext aber korrekt ausgesprochen wird. Insgesamt ist die Änderung der Umgebung für das Gebietsschema für jede Ansicht die Lösung, um die von VoiceOver in SwiftUI verwendete Sprache für die Barrierefreiheit zu ändern."
Der Artikel behandelt, wie man die vertikale Ausrichtung von Inhalten innerhalb einer ScrollView in SwiftUI verwaltet, insbesondere bei der Anpassung an dynamische Schriftgrößen. Anfangs wird eine einfache ScrollView verwendet, um Inhalte aufzunehmen, die die Bildschirmhöhe überschreiten könnten. Dies führt jedoch dazu, dass sich der Inhalt oben ausrichtet, wenn er kleiner als die ScrollView ist, was unerwünscht ist. iOS 17 führte den Modifier defaultScrollAnchor ein, der aber die nötige Feinheit vermissen lässt, um Inhalte nur dann zu zentrieren, wenn sie in die ScrollView passen. iOS 18 behebt dies mit einem neuen defaultScrollAnchor Modifier, der einen role-Parameter enthält. Dieser Parameter ermöglicht es Entwicklern, den Ankerpunkt für verschiedene Situationen anzupassen, einschließlich der Ausrichtung von Inhalten, die kleiner als der Container sind, mit Hilfe von .alignment. Indem man den Anker für die .alignment-Rolle auf .center setzt, wird der Inhalt zentriert, wenn er passt, und oben ausgerichtet, wenn er die Höhe des Containers überschreitet. Die beiden Varianten des View-Modifiers können zusammen verwendet werden, um den Standard zu ändern und den Anker für bestimmte Rollen zu überschreiben. Der neue Modifier bietet einen differenzierteren Ansatz zur Verwaltung der Inhaltsausrichtung in ScrollViews, basierend auf seiner Größe im Verhältnis zum Container. Dies gewährleistet eine bessere Benutzererfahrung, indem die vertikale Position des Inhalts dynamisch angepasst wird.
CdXz5zHNQW_YDEZMZMpGv.png
„Zum Senden von Benachrichtigungen an lokale Benutzer ist eine ausdrückliche Genehmigung des Benutzers erforderlich, die durch Aufrufen der Methode „requestAuthorization“ mit den gewünschten Optionen erfolgen kann. Dies kann den Benutzer jedoch mit einer Berechtigungsabfrage unterbrechen, was möglicherweise nicht optimal ist. Die in iOS 12 eingeführte vorläufige Berechtigung bietet eine Alternative, indem Benachrichtigungen unauffällig zugestellt werden können, ohne den Benutzer zu unterbrechen. Um eine vorläufige Berechtigung anzufordern, füge der Berechtigungsanfrage die Option „.provisional“ hinzu. Bei Verwendung einer vorläufigen Berechtigung werden Benachrichtigungen in das Benachrichtigungscenter mit Schaltflächen zugestellt, mit denen der Benutzer die Benachrichtigungen beibehalten oder deaktivieren kann. Der Benutzer kann festlegen, dass Benachrichtigungen sofort, unauffällig oder als Teil einer geplanten Zusammenfassung zugestellt werden. Eine vorläufige Berechtigung gewährt keine volle Erlaubnis zum Anzeigen von Warnungen oder dem Anbringen einer Plakette auf dem App-Symbol. Hierfür muss der Benutzer seine Benachrichtigungseinstellungen ändern. Berücksichtige beim Überprüfen des Berechtigungsstatus den vorläufigen Status, um die Berechtigung zu prüfen. Eine vorläufige Berechtigung kann für die meisten Apps ein fairer Kompromiss sein, hängt aber letztlich vom jeweiligen Anwendungsfall ab. Die Überprüfung des Berechtigungsstatus vor dem Senden einer Benachrichtigung ist entscheidend, um sicherzustellen, dass Benachrichtigungen korrekt zugestellt werden.
CdXz5zHNQW_jArWhqLPsY.png
Um das Bild eines SwiftUI-Buttons zu ändern, wenn der Benutzer den Button drückt, können Sie einen benutzerdefinierten Button-Stil erstellen, der einen Titel und zwei Bilder für die Standard- und Druckzustände akzeptiert. Dieser benutzerdefinierte Stil kann durch Erstellen einer Struktur erreicht werden, die dem ButtonStyle-Protokoll entspricht. Die ButtonStyleConfiguration gibt Ihnen Zugriff auf das Button-Label, den isPressed-Zustand und die Button-Rolle, die verwendet werden können, um das anzuzeigende Bild zu bestimmen. In der makeBody-Methode können Sie die Button-Konfiguration überprüfen und ein Label mit dem richtigen Bild basierend auf dem isPressed-Zustand zurückgeben. Dann können Sie diesen benutzerdefinierten Stil verwenden, um einen bestimmten Typ von Button, wie z.B. einen InfoButton, zu erstellen, der den benutzerdefinierten Stil verwendet, um ein anderes Bild anzuzeigen, wenn er gedrückt wird. Der InfoButton kann in Ihrer App verwendet werden, indem Sie ihn mit einer Aktion aufrufen, die ausgeführt werden soll, wenn der Button gedrückt wird. Sie können auch eine Animation zum benutzerdefinierten Stil hinzufügen, um das Bild bei Druck zu skalieren, indem Sie den symbolEffect-Modifier verwenden. Dieser Ansatz ermöglicht es Ihnen, einen ähnlichen Effekt wie die Zustandskonfigurationen von UIKit-Buttons in SwiftUI zu erreichen. Der benutzerdefinierte Button-Stil kann für andere Buttons in Ihrer App wiederverwendet werden, was ihn zu einer praktischen Lösung macht. Insgesamt ist das Erstellen eines benutzerdefinierten Button-Stils eine gute Möglichkeit, das Aussehen von SwiftUI-Buttons anzupassen, insbesondere wenn die integrierten Stile nicht Ihren Anforderungen entsprechen.
"Der Human Interface Guide von Apple rät davon ab, Bewegungen in einer Benutzeroberfläche hinzuzufügen, ohne dass sie einen bestimmten Zweck erfüllen, da sie die Benutzer ablenken und unangenehm sein können. Bewegungen sollten optional sein und nicht die einzige Möglichkeit sein, wichtige Informationen zu vermitteln. Bestimmte Arten von Bewegungen, wie z.B. oszillierende Bewegungen und große Animationen, können für Benutzer problematisch sein. Benutzer können die Bewegungen in ihren Geräteeinstellungen für Barrierefreiheit reduzieren, was die Standard-Übergänge zwischen Ansichten beeinflussen kann. Allerdings müssen Entwickler bei benutzerdefinierten Animationen selbst tätig werden, indem sie problematische Bewegungen deaktivieren oder ersetzen. Die Einstellung "Bewegung reduzieren" kann in SwiftUI-Ansichten mithilfe der @Environment-Eigenschaft erkannt werden. Die Dokumentation empfiehlt, große Animationen, die die dritte Dimension simulieren, zu vermeiden, wenn die Einstellung "Bewegung reduzieren" aktiviert ist. Um Animationen zu deaktivieren, können Entwickler berechnete Eigenschaften erstellen, die den Zustand der Einstellung "Bewegung reduzieren" berücksichtigen. Dies kann erreicht werden, indem nil für die Animation zurückgegeben wird, wenn die Einstellung "Bewegung reduzieren" aktiviert ist, was die Animation effektiv deaktiviert. Entwickler müssen entscheiden, wann und wie sie auf die Einstellung "Bewegung reduzieren" für ihre eigenen Animationen reagieren."
CdXz5zHNQW_8fvTYjYZBQ.png
"Swift Testing ist ein quelloffenes Testframework, das speziell für Swift entwickelt wurde und von Apple auf der WWDC24 vorgestellt und mit Xcode 16 ausgeliefert wurde. Es nutzt moderne Funktionen wie Konkurrenz und Makros und unterstützt neben Apples Plattformen auch Windows und Linux. Es gibt keinen dringenden Grund, von XCTest auf Swift Testing umzustellen, aber Swift Testing bietet mehrere Vorteile, darunter die Möglichkeit, Tests mithilfe von Swift-Konkurrenz in einem Prozess auszuführen, was parallele Tests auf physischen Geräten ermöglicht.Um mit Swift Testing zu beginnen, können Sie XCTest- und Swift-Testing-Einheitstests in einem Testziel mischen, sollten jedoch nicht innerhalb eines Tests verschiedene Testframeworks mischen. Sie können das Swift-Testing-Framework importieren, indem Sie "import Testing" in Ihre Testdatei einfügen. Apple empfiehlt, Tests zu gruppieren, indem Sie sie einem Typ wie einer Struktur oder Klasse hinzufügen und die init-Methode für die Einrichtung und den Abbau verwenden.Swift-Testing-Tests sind normale Swift-Methoden, die zu Einheitstests werden, wenn Sie das @Test-Makro hinzufügen. Sie können Testmethoden mit async oder throws markieren und sie nach Bedarf auf einen Actor isolieren. Das @Test-Attribut ist ein Makro, das erweitert werden kann, um die Implementierung zu sehen.Swift Testing verwendet die #expect- und #require-Makros für Behauptungen, die mehr Flexibilität und informative Fehlermeldungen als XCTest's XCTAssert bieten. Das #expect-Makro protokolliert fehlgeschlagene Erwartungen und setzt den Test fort, während das #require-Makro eine Ausnahme auslöst, die die Testausführung bei einem Fehler stoppt.Sie können auch Issue.record verwenden, um einen Test ohne Auswertung einer Bedingung fehlschlagen zu lassen, ähnlich wie XCTFail in XCTest. Insgesamt bietet Swift Testing mehrere Vorteile gegenüber XCTest, darunter verbesserte Konkurrenzunterstützung und flexiblere Behauptungen."
In iOS 18 hat Apple einen optionalen isEnabled-Parameter für verschiedene Barrierefreiheitsmodifikatoren in SwiftUI eingeführt. Dieser Parameter ermöglicht es Entwicklern, Barrierefreiheitsmodifikatoren bedingungsabhängig basierend auf bestimmten Bedingungen anzuwenden. Der isEnabled-Parameter ist für Modifikatoren wie .accessibilityLabel, .accessibilityInputLabels, .accessibilityValue und .accessibilityHint verfügbar. Diese Funktion ist nützlich, wenn Entwickler das Standardverhalten der Barrierefreiheit bedingungsabhängig überschreiben müssen. Beispielsweise kann in einer Liste von Elementen mit einem Button zum Umschalten des Favoritenstatus die Standard-Barrierefreiheitsbezeichnung für die Button-Aktion basierend auf dem Favoritenstatus geändert werden. Anstatt eine bedingte Barrierefreiheitsbezeichnung bereitzustellen, können Entwickler die isEnabled-Variante des Modifikators verwenden, um nur dann eine benutzerdefinierte Bezeichnung anzuwenden, wenn eine bestimmte Bedingung erfüllt ist. Dieser Ansatz vermeidet die Wiederholung und Lokalisierung der Standardbezeichnung. Im angegebenen Beispiel wird der Modifikator .accessibilityLabel mit dem isEnabled-Parameter verwendet, um nur dann eine benutzerdefinierte Bezeichnung „Nicht mehr Favorit“ anzuwenden, wenn das Element als Favorit markiert ist. Dies ist eine kleine Verbesserung, die den Code vereinfacht und den Lokalisierungsaufwand reduziert. Die Einführung des isEnabled-Parameters in iOS 18 erhöht die Flexibilität von Barrierefreiheitsmodifikatoren in SwiftUI.