【问题标题】:How to toggle Bold and Italic of UIFont如何切换 UIFont 的粗体和斜体
【发布时间】:2021-08-13 14:19:55
【问题描述】:

我正在尝试使用 textKit 在 swift 中将粗体和斜体应用于 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)
}

我想要实现的是

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

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

【问题讨论】:

  • size: 0.0?你不使用currentFont.pointSize?现在,尚不清楚,文本可以同时是粗体和斜体,还是两者之一?
  • 它是两者之一,但不会在两者之间交换
  • @Larme 两者都可以,你可以在笔记应用中查看

标签: ios swift uitextview textkit nstextstorage


【解决方案1】:

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

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)

【讨论】:

  • 有没有办法检查选择了“粗体”还是“斜体”?
  • @akku fontDescriptor.symbolicTraits.contains(.traitItalic)
  • 'if (fontDescriptor!.symbolicTraits.contains(.traitItalic)) { changedFontDescriptor = fontDescriptor!.withSymbolicTraits(fontDescriptor!.symbolicTraits.union(.traitItalic)) } else { changedFontDescriptor = fontDescriptor!.withSymbolicTraits (fontDescriptor!.symbolicTraits.union(.traitBold)) }' 这不起作用?
  • @akku 如果您正在检查是否有斜体,那么您将添加一个斜体(这不会改变任何内容),否则您将添加粗体。不知道你要做什么,但这对我来说听起来不正确
  • 我想在所选文本的粗体和斜体之间进行切换。但我无法完成它。所以我想检查哪个是“粗体”、“斜体”或下划线
猜你喜欢
  • 2012-01-21
  • 2021-12-12
  • 1970-01-01
  • 2012-02-11
  • 2013-04-07
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多