2017-02-13 2 views
0

In meiner iOS App habe ich in den Texten von mp3s, dass ich in einer scrollbaren nicht editierbaren Textansicht spiele. Ich möchte die Textansicht automatisch nach der Länge jedes MP3s scrollen. Wie kann ich es in Swift 3 machen?Swift 3 - Auto scroll UITextView nach mp3-Länge

+0

Haben Sie versucht, eine 'Timer' mit? – nighttalker

+0

Verwenden Sie einen Timer und legen Sie den Bildlauf Ihres UITextView basierend auf der Position des Players fest. –

+0

@nighttalker, können Sie mehr bitte bitte? Ich dachte über die Verwendung eines Timers aber konnte nicht wissen, wie man die Textansicht basierend auf der aktuellen Zeit des Liedes autoscroll – SergeH

Antwort

3

Alles, was Sie tun müssen, ist ein Timer Zeitplan und berechnen, wo in der Update-Methode (der Selektor) blättern.

Irgendwo in Ihrer Klasse:

var timer = Timer() 

func update() { 
    // Assuming you're using an AVAudioPlayer, calculate how far along you are 
    let progress = player.currentTime/player.duration 

    // Get the number of characters 
    let characters = textView.text.characters.count 

    // Calculate where to scroll 
    let location = Double(characters) * progress 

    // Scroll the textView 
    text.scrollRangeToVisible(NSRange(location: Int(location), length: 10)) 
} 

Dann, wenn Sie den Timer starten wollen:

timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(update), userInfo: nil, repeats: true) 

Wenn der Song ist abgeschlossen, erlischt der Timer.

+1

Große Antwort! Ich frage mich nur, dass das nicht mit den Lyrics synchronisiert wird, da sie nicht unbedingt mit einer konstanten Rate fließen werden. Er muss vielleicht eine Bibliothek von Timestamp-Markern mit dem Text erstellen oder so, dass die Texte genau mit dem Sound synchronisiert werden. – Antoine

+0

Danke, dass es funktioniert hat! Und ja, @ Antoine hatte Recht, das Scrollen stimmte nicht mit dem Text überein. Ich habe das nicht durchdacht. Ich glaube nicht, dass es so funktionieren würde, wie ich es mir vorgestellt habe. Trotzdem danke – SergeH

0

Sie könnten Content gesetzt:

func autoScroll() { 
    let progress = currentTime/duration 
    let contentOffset = CGPoint(x: 0.0, y: textView.contentSize.height * progress) 
    textView.setContentOffset(contentOffset, animated: true) 
} 

Und Timer starten:

let timer = Timer(timeInterval: 0.5, target: self, selector: #selector(autoScroll), userInfo: nil, repeats: true) 
RunLoop.current.add(timer, forMode: .commonModes)