2

我正在尝试使用 textKit 快速将粗体和斜体应用于 UITextView 中的选定文本。

这是代码:

let isBold = false

if !isActive(modification: .swapBoldWithItalic) || isBold{
    storage.setAttributes(attributes, range: range)
} else {
    let currentFont = attributes![.font] as? UIFont
    
    let fontDescriptor = currentFont?.fontDescriptor
    
    var changedFontDescriptor: UIFontDescriptor?
    
    if fontDescriptor!.symbolicTraits.contains(.traitItalic) {
        changedFontDescriptor = fontDescriptor?.withSymbolicTraits(fontDescriptor!.symbolicTraits.union(.traitItalic))
        
    } else {
        changedFontDescriptor = fontDescriptor?.withSymbolicTraits(fontDescriptor!.symbolicTraits.union(.traitBold))
        
    }
    
    
    var updatedFont: UIFont? = nil
    if let changedFontDescriptor = changedFontDescriptor {
        updatedFont = UIFont(descriptor: changedFontDescriptor, size: (currentFont?.pointSize)!)
        
    }
    let dict = [
        NSAttributedString.Key.font: updatedFont,
        NSAttributedString.Key.foregroundColor: UIColor.red
    ]
    
    storage.setAttributes(dict, range: range)
}

我想要实现的是

  • 将所选文本更改为粗体或斜体
  • 将选定的粗体文本更改为斜体,反之亦然

现在发生的情况是,当我选择文本并将其更改为粗体时,它会更改为粗体,但是当我尝试将另一个文本更改为斜体时,它也会更改为粗体,我仍然无法从粗体切换为斜体。

4

1 回答 1

2

我怀疑您想通过不同的按钮切换粗体和斜体。我做了一个扩展,您可以轻松使用:

extension UIFont {
    func byTogglingSymbolicTraits(_ symbolicTraits: UIFontDescriptor.SymbolicTraits) -> UIFont {
        UIFont(
            descriptor: fontDescriptor.byTogglingSymbolicTraits(symbolicTraits),
            size: pointSize
        )
    }
}

extension UIFontDescriptor {
    func byTogglingSymbolicTraits(_ traints: UIFontDescriptor.SymbolicTraits) -> UIFontDescriptor {
        if symbolicTraits.contains(traints) {
            return withSymbolicTraits(symbolicTraits.subtracting(traints))!
        } else {
            return withSymbolicTraits(symbolicTraits.union(traints))!
        }
    }
}

用法:

font = font.byTogglingSymbolicTraits(.traitBold)
// or
font = font.byTogglingSymbolicTraits(.traitItalic)
于 2021-08-13T14:39:36.803 回答