当前位置: 首页 > 面试题库 >

NSAttributedString,更改字体总体,但保留所有其他属性吗?

干永丰
2023-03-14
问题内容

说我有一个NSMutableAttributedString

在整个字符串中,字符串具有 多种 __格式 组合

这是一个例子:

这个字符串 在iOS中 很难 改变*真的 很烂 *

但是,字体本身不是您想要的字体。

我想要:

对于每个字符,将该字符更改为特定 字体 (例如Avenir)

对于每一个角色, 保持组合其他 这是以前对这个角色的地方归因(粗体,斜体,颜色,等等等等)。

你到底是怎么做到的?

注意:

如果您在整个范围内微不足道地添加属性“ Avenir”:它只是 删除了所有其他属性范围 ,则会丢失所有格式。不幸的是,属性 实际上不是
“加法”的。


问题答案:

由于rmaddy的答案对我f.fontDescriptor.withFace(font.fontName)不起作用(不保留粗体之类的特征),因此这是Swift
4的更新版本,其中还包括颜色更新:

extension NSMutableAttributedString {
    func setFontFace(font: UIFont, color: UIColor? = nil) {
        beginEditing()
        self.enumerateAttribute(
            .font, 
            in: NSRange(location: 0, length: self.length)
        ) { (value, range, stop) in

            if let f = value as? UIFont, 
              let newFontDescriptor = f.fontDescriptor
                .withFamily(font.familyName)
                .withSymbolicTraits(f.fontDescriptor.symbolicTraits) {

                let newFont = UIFont(
                    descriptor: newFontDescriptor, 
                    size: font.pointSize
                )
                removeAttribute(.font, range: range)
                addAttribute(.font, value: newFont, range: range)
                if let color = color {
                    removeAttribute(
                        .foregroundColor, 
                        range: range
                    )
                    addAttribute(
                        .foregroundColor, 
                        value: color, 
                        range: range
                    )
                }
            }
        }
        endEditing()
    }
}

笔记

的问题f.fontDescriptor.withFace(font.fontName)是,它消除了象征性的特质一样italicbold或者compressed,因为它会因为某些原因忽略那些与字型的默认特征。为什么这是如此令我难以理解,甚至可能是苹果的疏忽。或“不是错误,而是功能”,因为我们免费获得了新字体的特征。

因此,我们要做的是创建一个字体描述符,该描述符具有原始字体的字体描述符中的符号特征.withSymbolicTraits(f.fontDescriptor.symbolicTraits)。为rmaddy支持我迭代的初始代码

我已经在生产应用程序中交付了它,我们在其中通过解析HTML字符串NSAttributedString.DocumentType.html,然后通过上述扩展名更改字体和颜色。到目前为止没有问题。



 类似资料:
  • 问题内容: 我正在使用hibernate作为持久层。存在于同一表中的2个实体通过单表继承策略扩展了一个超类。 我有一个ID为4的B实例。如何将此实例的类型更改为C并保留其ID(4)? 上面的代码因 有可能吗? 问题答案: Hibernate尝试使持久性尽可能地透明-这意味着它尝试遵循与普通Java对象相同的原则。现在,用Java改写您的问题,您将获得: 如何将B类的实例转换为(不兼容的)C类的实例

  • 问题内容: 我通常将文字设置为粗体(或斜体或其他字体属性) 如何仅删除粗体属性,而不更改到目前为止可能已设置的其他属性? 问题答案: 这会将样式设置为正常,而不会更改颜色或大小。 但是您不能以这种方式混合使用粗体/斜体/下划线文本。如果指定粗体,则所有文本均将为粗体。如果要混合文本样式,建议使用HTML设置文本样式,然后使用以下代码。

  • 问题内容: 我打算在微调器中将文本字体更改为arialbold。以下是我的代码:- 问题答案: 类: 版面: my_spinner_style.xml TTF文件

  • 我需要使用boto3更新我的Dynamodb表中的时间戳属性,但是属性名称“时间戳”是一个保留字,所以它在SET命令上抛出一个错误。 “errorMessage”:“调用UpdateItem操作时发生错误(ValidationException):无效的UpdateExpression:属性名称是保留关键字;保留关键字:时间戳”,

  • 本文向大家介绍iOS更改字体,包括了iOS更改字体的使用技巧和注意事项,需要的朋友参考一下 示例 Swift Objective-C            

  • 使用DOM PDF创建一些报告,但是我唯一遇到的问题是设置无衬线字体。 我尝试了几乎所有的方法来设置CSS中可能的字体,但它总是以衬线字体呈现。 我并没有试图呈现一个自定义字体,只是一些简单的东西,比如helvetica或arial。 有没有其他人有过这个问题,或者知道为什么它可能会默认为衬线? 注意:应用程序在CodeIgnitor上运行。