Чтобы проверить, если текст уже подчеркнут, вы можете просто запустить contains(_:)
для атрибутов текста, т.е.
func isUnderlined(attrText: NSAttributedString) -> Bool {
var contains: ObjCBool = false
attrText.enumerateAttributes(in: NSRange(location: 0, length: attrText.length), options: []) { (dict, range, value) in
if dict.keys.contains(.underlineStyle) {
contains = true
}
}
return contains.boolValue
}
Пример:
let attrText1 = NSAttributedString(string: "This is an underlined text.", attributes: [.underlineStyle : NSUnderlineStyle.styleSingle.rawValue])
let attrText2 = NSAttributedString(string: "This is an underlined text.", attributes: [.font : UIFont.systemFontSize])
print(self.isUnderlined(attrText: attrText1)) //true
print(self.isUnderlined(attrText: attrText2)) //false
Вы можете использовать вышеуказанную логику в вашем UITextView
согласно вашему требованию.
Чтобы удалить атрибут,
1. в первую очередь это должен быть NSMutableAttributedString
.
2. Затем, чтобы удалить атрибут, используйте метод removeAttribute(_:range:)
для приписанной строки.
let attrText1 = NSMutableAttributedString(string: "This is an underlined text.", attributes: [.underlineStyle : NSUnderlineStyle.styleSingle.rawValue])
print(self.isUnderlined(attrText: attrText1)) //true
if self.isUnderlined(attrText: attrText1) {
attrText1.removeAttribute(.underlineStyle, range: NSRange(location: 0, length: attrText1.string.count))
}
print(self.isUnderlined(attrText: attrText1)) //false
Ручка textView
при нажатии кнопки
@IBAction func onTapButton(_ sender: UIButton) {
if let selectedTextRange = self.textView.selectedTextRange {
let location = self.textView.offset(from: textView.beginningOfDocument, to: selectedTextRange.start)
let length = self.textView.offset(from: selectedTextRange.start, to: selectedTextRange.end)
let range = NSRange(location: location, length: length)
self.textView.attributedText.enumerateAttributes(in: range, options: []) { (dict, range, value) in
if dict.keys.contains(.underlineStyle) {
self.textView.textStorage.removeAttribute(.underlineStyle, range: range)
} else {
self.textView.textStorage.addAttributes([.underlineStyle : NSUnderlineStyle.styleSingle.rawValue], range: range)
}
}
}
}