4 votes

Afficher un mot texte mot par mot lentement en swift

Swift 5 iOS 13

Essayer d'afficher une phrase mot par mot lentement. J'ai rédigé ce code qui fonctionne, mais je crains de faire planter le téléphone avec trop de threads si je lui passe une phrase trop longue.

    let textFeed = "Un message texte composé de mots"
    var second = 1
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {

      for word in textFeed.components(separatedBy: " ") {
        var delay = DispatchTimeInterval.seconds(second)
        DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
          self.infoText2.text = String(word)

          print("mot",word,second)
        })
        second = second + 1
      }
    })

Des idées pour faire cela différemment, avec moins de threads?

0 votes

Vérifiez ma réponse peut-être cela vous aide

2voto

esemusa Points 106

Une fonction rekusive simple

printMessage(message: "Je suis un test")

func printMessage(message: String?, delay: TimeInterval = 1) {
        let splits = message?.split(separator: " ", maxSplits: 1)
        print(splits?.first)
        DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {[weak self] in
            guard splits?.count == 2 else {
                return
            }
            self?.printMessage(message: String(splits?.last ?? ""))
        })
    }

1voto

J'ai ce morceau de code

extension String {
var characterArray: [Character]{
    var characterArray = [Character]()
    for character in self {
        characterArray.append(character)
    }
    return characterArray
}
}

extension UITextView {
func typeOn(string: String) {
    let characterArray = string.characterArray
    var characterIndex = 0
    Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
        self.text.append(characterArray[characterIndex])
        characterIndex += 1
        if characterIndex == characterArray.count {
            timer.invalidate()
        }
    }
}
}

// et dans votre contrôleur de vue, il suffit de l'appeler comme ceci 

override func viewDidLoad() {
    super.viewDidLoad()
    let msg:String = "test"
    youttextView.typeOn(string: msg)
}

0 votes

Le tableau de caractères de chaîne ne semble pas exister sur iOS 13 sous swift 5.x.

0 votes

Oh désolé j'ai oublié quelque chose vérifiez la réponse modifiée

0 votes

Je voterais pour cela comme réponse acceptée, mais elle est basée sur un textview en fin de compte et j'ai un UILabel. Je l'ai réécrit et posté une nouvelle solution basée sur cela!

1voto

user3069232 Points 3201

Basé sur la réponse donnée par Was'Siim Ben Hssen, seul celui-ci utilise un UILabel.

let textFeed = "imprimer les mots un par un lentement"

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
    let words = textFeed.components(separatedBy: " ")
    var i = 0
    Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { (timer) in
          self.infoText2.text = String(words[i])
          self.infoText.text = self.infoText.text! + String(words[i]) + " "
          if i == words.count - 1 {
            timer.invalidate()
          } else {
            i = i + 1
          }
    }
    })

Changez ces deux lignes pour obtenir une révélation caractère par caractère.

//        let words = textFeed.components(separatedBy: " ")
          let words = Array(textFeed)
//        self.infoText.text = self.infoText.text! + String(words[i]) + " "
          self.infoText.text = self.infoText.text! + String(words[i])

1 votes

Et ça fonctionne mieux que mon original! MERCI Was'Siim!

0 votes

La première solution fonctionne pour moi, pourquoi ne fonctionne-t-elle pas pour vous ? Avez-vous trouvé le problème ?

1 votes

La première solution lance un nouveau thread pour chaque mot, comme la mienne l'a fait. Cela entraînait une surcharge massive.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X