Probleme (und Lösungen) in iOS 16

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme (und Lösungen) in iOS 16

    Hi!,

    Ich machen hier mal einen Thread auf, in dem ich Probleme ansprechen will, die mir im Zusammenhang mit iOS 16 aufgefallen sind. Sofern ich es schon gelöst habe, kommt die Lösung natürlich gleich mit dazu. Ich lade gerne andere ein, hier ebenfalls Probleme zu posten und einen Sammelthread draus zu machen.

    List und ScrollView mit durchsichtigen Hintergrund

    Das erste Problem betrifft List oder ScrollView in SwiftUI, die man durchsichtig machen möchte. Bisher hat man dazu mit init() oder onAppear() folgendes angegeben:

    UITableView.appearance().backgroundColor = .clear /* bzw. UIScrollView */

    In SwiftUI 4 und iOS 16 funktioniert das nicht mehr und stattdessen ist der Modifier scrollContentBackground dazugekommen. Um das für iOS 15 und 16 halbwegs einfach zu gestalten, habe ich folgenden Modifier gebaut, der je nach iOS-Version das passende aufruft:

    Quellcode: ClearBackgroundModifier.swift

    1. import SwiftUI
    2. struct ClearBackgroundModifier: ViewModifier {
    3. @ViewBuilder
    4. func body(content: Content) -> some View {
    5. if #available(iOS 16.0, *) {
    6. content
    7. .scrollContentBackground(.hidden)
    8. } else {
    9. content
    10. .onAppear() {
    11. UITableView.appearance().backgroundColor = .clear
    12. UIScrollView.appearance().backgroundColor = .clear
    13. }
    14. }
    15. }
    16. }
    17. extension View {
    18. func clearBackground() -> some View {
    19. modifier(ClearBackgroundModifier())
    20. }
    21. }
    Alles anzeigen
    So kann der dann einfach verwendet werden:

    Quellcode

    1. List {
    2. // …
    3. }
    4. .clearBackground()
    Vielleicht hilft es ja jemand, der ein ähnliches Problem hat.
    So Long, and Thanks for All the Fish.
  • Sprachausgabe mit AVSpeechSynthesizer

    Das Problem hatte ich hier schon mal angesprochen und von manoh die Lösung erhalten. Der Vollständigkeit halber poste ich es hier trotzdem noch mal:

    In iOS 15 konnte man folgendermaßen Text aussprechen lassen:

    Quellcode: ContentView.swift

    1. import SwiftUI
    2. import AVFoundation
    3. struct ContentView: View {
    4. var body: some View {
    5. VStack {
    6. Button("Play Audio") {
    7. let utterance = AVSpeechUtterance(string: "Hallo Welt")
    8. utterance.voice = AVSpeechSynthesisVoice(language: "de-DE")
    9. let synthesizer = AVSpeechSynthesizer()
    10. synthesizer.speak(utterance)
    11. }
    12. }
    13. }
    14. }
    Alles anzeigen

    Mit Xcode 14 und iOS 16 muss der AVSpeechSynthesizer aber schon in der Struct initialisiert werden:

    Quellcode: ContentView.swift

    1. import SwiftUI
    2. import AVFoundation
    3. struct ContentView: View {
    4. let synthesizer = AVSpeechSynthesizer()
    5. var body: some View {
    6. VStack {
    7. Button("Play Audio") {
    8. let utterance = AVSpeechUtterance(string: "Hallo Welt")
    9. utterance.voice = AVSpeechSynthesisVoice(language: "de-DE")
    10. synthesizer.speak(utterance)
    11. }
    12. }
    13. }
    14. }
    Alles anzeigen
    Ein weiteres Problem mit fehlerhaften Stimmen wurde im verlinkten Thread ebenfalls angesprochen.
    So Long, and Thanks for All the Fish.
  • Babelfisch schrieb:

    Mit Xcode 14 und iOS 16 muss der AVSpeechSynthesizer aber schon in der Struct initialisiert werden:
    Wenn ich mir die Dokumentation zu AVSpeechSynthesizer anschaue, dann steht das auch so drinnen, dass man AVSpeechSynthesizer halten muss. Eine Änderung zu iOS 16 habe ich nicht entdeckt. Vielleicht war das einfach zuvor ein Bug, den Du ausgenutzt hast.

    Apple schrieb:

    Note

    The system doesn’t automatically retain the speech synthesizer so you need to manually retain it until speech concludes.
  • Ja, auf die direkt Seite von AVSpeechSynthesizer hätte ich mal schauen können. :whistling: Ich hatte nur auf die Hauptseite geschaut und dort gibt es keinen Hinweis darauf. Und das Beispiel dort ist durch die Reihenfolge zumindest etwas missverständlich.

    Aber egal, so wie es von Apple dann im Detail beschrieben wird, ist es richtig und dann wohl wirklich eher ein Bug von iOS 15 als von iOS 16. Der Hinweis hier ist aber sicherlich nicht unbedingt verkehrt, zumal es einige Beispiel im Netz gibt, die es genau so aufzeigen.
    So Long, and Thanks for All the Fish.