在UITextView中使短语可点击

时间:2019-02-18 15:05:51

标签: ios swift storyboard uitextview

我想知道如何使电子文本可单击,并在单击特定文本时播放声音。

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 :(得分:0)

首先,textView委托方法签名错误。假设词组数组是一个数组文字,您无需隐瞒数据即可分配AttributedStrings。 我写了一个示例项目,说明如何实现此目的。您可以点击文本视图内容的唯一方法是分配.link类型的属性。 在此示例中,关键是为链接属性分配不同的url,否则,CoreText将整个textview内容视为单个链接。

Here´s示例项目。仔细看看,让我知道是否有帮助。