Переключить атрибуты selectedRange в UITextView - PullRequest
0 голосов
/ 07 мая 2019

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

func bold() {
    if let textRange = selectedRange {
        let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17, weight: UIFont.Weight.bold)]
        noteContents.textStorage.addAttributes(attributes as [NSAttributedString.Key : Any], range: textRange)
    }

1 Ответ

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

Это может помочь:

func toggleBold() {
    if let textRange = selectedRange {

        let attributedString = NSAttributedString(attributedString: noteContents.attributedText)

        //Enumerate all the fonts in the selectedRange
        attributedString.enumerateAttribute(.font, in: textRange, options: []) { (font, range, pointee) in
            let newFont: UIFont
            if let font = font as? UIFont {
                if font.fontDescriptor.symbolicTraits.contains(.traitBold) { //Was bold => Regular
                    newFont = UIFont.systemFont(ofSize: font.pointSize, weight: .regular)
                } else { //Wasn't bold => Bold
                    newFont = UIFont.systemFont(ofSize: font.pointSize, weight: .bold)
                }
            } else { //No font was found => Bold
                newFont = UIFont.systemFont(ofSize: 17, weight: .bold) //Default bold
            }
            noteContents.textStorage.addAttributes([.font : newFont], range: textRange)
        }
    }
}

Мы используем enumerateAttribute(_:in:options:using:) для поиска шрифтов (поскольку жирный / не жирный) есть в этом атрибуте.Мы изменяем его в соответствии с вашими потребностями (полужирный <=> полужирный).

...