Сделайте фразу кликабельной в UITextView - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу знать, как сделать текст кликабельным и воспроизводить звук при нажатии на определенный текст.

enter image description here

Мне нужно определить, какиефраза была нажата, воспроизводить звук при нажатии на эту фразу и изменить цвет этой конкретной фразы.

Это функция, когда я создаю историю и назначаю ее UITextView

func showStory(){
    var ph:String?

    var s:String = ""

    var index = 0
    for phrase in phrasesArray {
        ph = phrase
        let data = ph!.data(using: String.Encoding.utf8)

        do{
            let txt = try NSAttributedString(data: data!,
                                             options: [.documentType: NSAttributedString.DocumentType.html,
                                                       .characterEncoding: String.Encoding.utf8.rawValue],
                                             documentAttributes: nil)

            s = txt.string

            let attributedString = NSMutableAttributedString(string: s, attributes: [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 14) , NSAttributedStringKey.link: audioArray[index]])

            attributedText.append(attributedString)

            index += 1
        }catch{}

        fullStory.attributedText = attributedText

    }
}

И это когда я обрабатываю, если пользователь касается UITextView

func textView(_ textView: UITextView, shouldInteractWith audio: URL, in characterRange: NSRange) -> Bool{

    //This is not working
    attributedText.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: characterRange)

    let soundFile = Bundle.main.url(forResource: audio.absoluteString, withExtension: "mp3")

    do{
        try sound = AVAudioPlayer(contentsOf: soundFile!)
        sound.prepareToPlay()

    }catch{
        print(error)
    }

    sound.play()


    return false
}

1 Ответ

0 голосов
/ 21 февраля 2019

Во-первых, подпись метода делегата textView неверна.Предполагая, что массив фраз является литералом массива, вам не нужно преобразовываться в Data, чтобы назначить AttributedStrings.Я написал пример проекта, иллюстрирующий, как это можно сделать.Единственный способ получить доступ к текстовому контенту - это присвоить атрибут типа .link.В этом примере ключом назначается другой URL для атрибута ссылки, в противном случае CoreText обрабатывает весь текстовый контент как одну ссылку.

? Здесь пример проекта.Посмотрите глубже и дайте мне знать, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...