Files
featherVoice/TUIKit/TUIRoomKit/Source/Common/Components/FloatChat/View/UITextView+Emoji.swift
2025-08-08 10:49:36 +08:00

73 lines
3.1 KiB
Swift

//
// UITextView+Emotion.swift
// TUILiveKit
//
// Created by krabyu on 2024/4/3.
//
import UIKit
extension UITextView {
func insertEmotionAttributedString(emotionAttributedString: NSAttributedString) {
guard let content = attributedText.mutableCopy() as? NSMutableAttributedString
else {
return
}
let location = selectedRange.location
content.insert(emotionAttributedString, at: location)
content.addAttributes([.font: font ?? UIFont.systemFont(ofSize: 14),
.foregroundColor: textColor ?? .black,],
range: NSRange(location: location, length: emotionAttributedString.length))
attributedText = content
let newRange = NSRange(location: location + emotionAttributedString.length, length: 0)
selectedRange = newRange
}
func insertEmotionKey(emotionKey: String) {
guard let content: NSMutableAttributedString = attributedText.copy() as? NSMutableAttributedString else { return }
let location = selectedRange.location
content.insert(NSAttributedString(string: emotionKey, attributes: [.font: font ?? UIFont.systemFont(ofSize: 14),
.foregroundColor: textColor ?? .black,]), at: location)
attributedText = content
let newRange = NSRange(location: location + emotionKey.count, length: 0)
selectedRange = newRange
}
func deleteEmotion() -> Bool {
let location = selectedRange.location
if location == 0 { return false }
let headSubstring = text.prefix(location)
if headSubstring.hasSuffix("]") {
for i in stride(from: headSubstring.count, to: 0 - 1, by: -1) {
let index = headSubstring.index(headSubstring.startIndex, offsetBy: i - 1)
let tempString = headSubstring[index]
if tempString == "[" {
guard let content: NSMutableAttributedString = attributedText.copy() as? NSMutableAttributedString else { return false }
content.deleteCharacters(in: NSRange(location: i - 1, length: headSubstring.count - (i - 1)))
attributedText = content
let newRange = NSRange(location: headSubstring.count, length: 0)
selectedRange = newRange
return true
}
}
}
return false
}
var normalText: String {
guard let attributedText = attributedText else { return "" }
var normalText = ""
attributedText.enumerateAttributes(in: NSRange(location: 0, length: attributedText.length)) { attributes, range, _ in
if let attachment = attributes[.attachment] as? EmotionAttachment {
let emotionAttachment = attachment
normalText += emotionAttachment.displayText
} else {
let substring = (attributedText.string as NSString).substring(with: range)
normalText += substring
}
}
return normalText
}
}