Перечислите изменяемую строку атрибута (кнопка подчеркивания) - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь создать UIButton, который позволяет выделить выделенный текст.Это мой текущий код:

func underline() {
if let textRange = selectedRange {
    let attributedString = NSMutableAttributedString(attributedString: textView.attributedText)
    textView.textStorage.addAttributes([.underlineStyle : NSUnderlineStyle.single.rawValue], range: textRange)
    }
}

В настоящее время он подчеркивает, но проблема, с которой я столкнулся, заключается в том, что мне нужно проверить, подчеркнут ли уже текущий текст и удаляется ли подчеркивание.Я не могу решить это с NSMutableAttributedString.

Я делаю это курсивом UIButton, например, так:

func italic() {
    if let textRange = selectedRange {
        let attributedString = NSAttributedString(attributedString: textView.attributedText)
        attributedString.enumerateAttribute(.font, in: textRange, options: []) { (font, range, pointee) in
            let newFont: UIFont
            if let font = font as? UIFont {
                let fontTraits = font.fontDescriptor.symbolicTraits
                if fontTraits.contains(.traitItalic) {
                    newFont = UIFont.systemFont(ofSize: font.pointSize, weight: .regular)
                } else {
                    newFont = UIFont.systemFont(ofSize: font.pointSize).italic()
                }
                textView.textStorage.addAttributes([.font : newFont], range: textRange)
            }
        }
    }
}

Как я могу достичь способностипроверить, есть ли у текущего текста подчеркивающий атрибут для моей первой функции?

Код, который мы имеем до сих пор:

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
}

func underline() {
    if let textRange = selectedRange {
        let attributedString = NSMutableAttributedString(attributedString: textView.attributedText)
        switch self.isUnderlined(attrText: attributedString) {
        case true:
            print("true")
            textView.textStorage.removeAttribute(.underlineStyle, range: textRange)
        case false:
            print("remove")
            textView.textStorage.addAttributes([.underlineStyle : NSUnderlineStyle.single.rawValue], range: textRange)
        }
    }
}

1 Ответ

1 голос
/ 14 мая 2019

Чтобы проверить, если текст уже подчеркнут, вы можете просто запустить 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)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...