我想知道如何使电子文本可单击,并在单击特定文本时播放声音。
我需要检测单击了哪个短语,单击该短语时播放声音,并更改该特定短语的颜色。
这是我创建故事并将其分配给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
}
答案 0 :(得分:0)
首先,textView委托方法签名错误。假设词组数组是一个数组文字,您无需隐瞒数据即可分配AttributedStrings。 我写了一个示例项目,说明如何实现此目的。您可以点击文本视图内容的唯一方法是分配.link类型的属性。 在此示例中,关键是为链接属性分配不同的url,否则,CoreText将整个textview内容视为单个链接。
Here´s示例项目。仔细看看,让我知道是否有帮助。