73 lines
3.1 KiB
Swift
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
|
||
|
|
}
|
||
|
|
}
|