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

2023-12-08

假设我有一个NSMutableAttributedString .

该字符串有多种多样的mix整个格式化:

这是一个例子:

这个字符串是hell to change in iOS, it really sucks.

然而,字体本身并不是您想要的字体。

我想要:

对于每个字符,将该字符更改为特定的font(比如,Avenir)

BUT,

对于每一个角色,keep the mix of other先前在该角色上使用的属性(粗体、斜体、颜色等)。

你到底是怎么做到的?


Note:

如果你在整个范围内简单地添加一个属性“Avenir”:它只是删除所有其他属性范围,您将丢失所有格式。不幸的是,属性are not,实际上是“加法”。


由于 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()
    }
}

Or,如果您的混合属性不包括字体,
那么你不需要删除旧字体:

let myFont: UIFont = .systemFont(ofSize: UIFont.systemFontSize);

myAttributedText.addAttributes(
    [NSAttributedString.Key.font: myFont],
    range: NSRange(location: 0, length: myAttributedText.string.count));

Notes

问题在于f.fontDescriptor.withFace(font.fontName)是它消除了像这样的象征性特征italic, bold or compressed,因为由于某种原因它会覆盖那些具有该字体默认特征的字体。我完全不明白为什么会出现这种情况,这甚至可能是苹果的疏忽。或者它“不是一个错误,而是一个功能”,因为我们免费获得新字体的特性。

所以我们要做的是创建一个字体描述符,它具有原始字体的字体描述符的符号特征:.withSymbolicTraits(f.fontDescriptor.symbolicTraits)。向 rmaddy 提供我迭代的初始代码。

我已经将其发送到生产应用程序中,我们通过以下方式解析 HTML 字符串NSAttributedString.DocumentType.html然后通过上面的扩展更改字体和颜色。到目前为止没有问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSAttributedString,整体更改字体但保留所有其他属性? 的相关文章

  • 获取 PHAsset 的本地文件路径

    我希望我的用户能够在 Instagram 上分享一张照片 并且我需要获取该照片的本地文件目录 不过 我将图像作为 PHAsset 获取 而不是 ALAsset 所有其他答案似乎都涵盖了这个主题 查看 PHAsset 文档 我没有看到 本地目
  • IOS - 委托与通知

    想听听您对以下架构的看法 在我的应用程序中 我有一个处理异步登录的静态类 LoginManager 登录阶段完成后 应用程序应该做出响应并转换到另一个状态 我有2条实施建议 使用委托 import Foundation protocol L
  • 有没有办法在 Swift XCTest UI 的测试之间重置应用程序?

    XCTest 中是否有 API 调用 我可以将其放入 setUP 或tearDown 中以在测试之间重置应用程序 我查看了 XCUIApplication 的点语法 我看到的只是 launch 或者有没有办法在 Swift 中调用 shel
  • 结构成员初始化 - 省略具有默认值的属性值

    我是 Swift 新手 正在关注在线文档 具体来说 我正在查看初始化 https docs swift org swift book LanguageGuide Initialization html https docs swift or
  • 在 Swift 中将单个整数值视为一个范围

    我需要验证字符串的长度 字符计数允许的值为 6 9 个字符 12个字符 15 个字符 所有具有不同字符数的字符串均无效 因此 我想创建一个 Swift 函数 它接受多个范围并计算字符串 extension String func evalu
  • WatchOS 应用程序未检测到配套的 iOS 应用程序

    我正在制作一个独立的Apple Watch应用程序 但有一个配套的iPhone应用程序 这对于手表应用程序的运行来说不是必需的 该应用程序使用手表连接如果安装了 iPhone 配套应用程序 则可以在设备之间同步数据 我可以打电话sessio
  • 如何将 GoogleAnalytics 标头导入到库框架中?

    我为我的项目创建一个库框架 我希望该框架能够依赖 Google Analytics 库 由于与应用程序目标不同 框架没有桥接标头 因此如何将标头导入到框架中 并且在框架的公共头文件中导入 Google Analytics 标头会产生其他意外
  • 具有多个页面的 UITableViewController 和 ContentViewController 之间的交换日期

    我正在开发一个应用程序 在该应用程序中 我需要通过单击 tableviewcontroller 中的 tableview 单元格 它是初始视图控制器 将一组值传递到具有页面卷曲转换的 contentview 视图控制器 每个页面都有一个文本
  • iOS WebView 空白

    我已使用 YouTube 的标准嵌入网址在我的 iOS 8 3 应用程序中嵌入了 YouTube 视频 sample http www youtube com embed HkAK9QRe4ds 它按预期工作 但看起来很奇怪 那个白色间隙
  • Firebase获取孩子ID swift ios

    我的 Firebase 看起来像这样 贝娄Active Orders看来childs根据他们的不同有不同的名字UID 用户身份 这是我的代码 用于获取孩子的 ID 无论孩子的名字是什么 但它似乎根本不起作用 获得的正确方法是什么child
  • 如何使用 AVCaptureVideoPreviewLayer 从相机应用程序实现 2 倍变焦

    我的应用程序中有一个 AVCaptureVideoPreviewLaye 它运行良好 并且显示与相机应用程序相同的预览视频 我想实现相机应用程序的 2 倍变焦功能 我该怎么做呢 基本上 我希望我的预览层将视频源更改为与您在点击 1x 图标将
  • 在 DecodingError 中采用 CustomNSError

    我正在使用 Crashlytics 编写一个错误记录器 并且遇到了一个问题 这个问题让我质疑我对协议和动态调度的理解 使用 Crashlytics 记录非致命错误时 API 需要一个符合错误的对象和一个可选的用户信息字典 我现在正在查看 J
  • didDeselectRowAtIndexPath indexPath 为 nil

    我有一个表视图控制器 它实现了 TableView 委托方法 public override func tableView tableView UITableView didSelectRowAtIndexPath indexPath NS
  • 关于将 Objective C 代码添加到 swift 动态框架的澄清

    我有一个 swift 动态框架 当前正在链接到另一个用 Objective C 编写的框架 这可以工作 但很烦人 因为 Objective C 框架实际上只有 2 个文件 我想知道是否有办法将其带入我的 swift框架 如果这是我会使用的应
  • Swift Animate 持续时间在 CGAffineTransform 中不起作用

    当我用 1 秒的动画翻译一个视图时 它不起作用 但当我执行 transform identity 时 它工作正常 这是我的代码 func hideCarousel UIView animate withDuration 1 animatio
  • 使用 OneSignal/Firebase 从 iOS 设备发送推送通知

    我正在开发一个应用程序 并试图找出当不同用户执行特定操作时如何通知特定用户 我试图避免设置自己的后端服务器 因为我相信我想做的事情可以通过 OneSignal Firebase 来完成 我还没有尝试过 但我认为每个用户都可以获得自己的 On
  • swift 中 pch 的替代品是什么?

    我想知道可以用什么来代替 swift 中的 pch 有没有 pch 的替代方案或方法可以快速摆脱导入 这样我们就不需要对所有类都这样做 我不想一直随身携带 进口 swift 中 pch 的最佳替代品是什么 您无法在 swift 中定义 宏
  • Xcode 8:使用 iOS 9.3 基础 SDK 编译?

    我在 Xcode 8 0 beta 8S128d 中将 iOS 应用程序升级到 Swift 3 0 我以为一切都已准备就绪 并将其上传到 iTunes Connect 当我点击 提交审核 时 它给了我一个包含 26 个错误的列表 每个嵌入式
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat

随机推荐

  • 如何在 MVC 中使用 LabelFor 插入换行符

    我的模型中有 Display Name Check to enter
  • 内联 SVG 的重复(过滤器)ID

    创建带有滤镜的内联 SVG 时 我必须为滤镜定义一个 ID 当我自动生成几个略有差异的内联SVG时 第一个图像的过滤器优先 覆盖 后续图像的过滤器 因为重复过滤器 ID 现场演示 更清晰 http jsfiddle net 9wqgS p
  • Automapper复杂类型映射异常

    我正在尝试为新模块实现 AutoMapper 我在网站上有 MVC 模型 我正在研究它 它看起来像这样 public class MvcModel public Params Params get set public Steps Step
  • 在参数化类中使用参数时获取不同的(非默认)小部件(holoviz 参数面板)

    我使用参数化类来构建面板仪表板 我想用一个交叉选择器但是当查看库 Param 提供的选项时 此选择器似乎不可用 似乎只有一个列表选择器 我如何使用 Param 获取此 CrossSelector import param import pa
  • 自动装配两个实现相同接口的 bean - 如何将默认 bean 设置为自动装配?

    背景 我有一个 Spring 2 5 Java Tomcat 应用程序 有下面这个bean 在整个应用程序的很多地方都用到了它 public class HibernateDeviceDao implements DeviceDao 以及以
  • 函数内部的静态变量不能保存对单例的引用

    我注意到 PHP 中的单例有一个奇怪的行为 除了举一个例子之外 没有更好的方法来解释这一点 假设我有以下单例类 class Singleton protected function construct Deny direct instant
  • 这些是什么 ASCII 字符?

    我有两个字符需要在 php 字符串中进行搜索和替换 不知何故 这些不同于 有谁知道我可以使用什么函数从 php 字符串中删除这些内容 这就是当有人在 Outlook 中向您发送电子邮件时会发生的情况 因此请小心 因为您完全错过了这些单引号的
  • iOS copyWithZone 仅在使用设备时无法识别选择器

    我正在开发一个 iPad 应用程序 仅当 sqlite 数据库中有某些数据时才会启动初始屏幕 如下所示 if int MyStore sharedInstance mode lt 0 self connectionSettingsViewC
  • 为 ggplot - R 安排数据帧格式

    我想将数据从宽格式重塑为长格式 以便我可以使用 ggplot 来创建图表 我在正确排列数据时遇到一些问题 到目前为止 我从 27 个数据帧的列表开始我的流程 仅向您展示前 10 个数据帧 gt str NDVI stat List of 2
  • SyntaxError:Object.parse(本机)npm 请求输入意外结束

    您好 我不明白为什么会出现此错误 我认为收到数据后就会执行回调 知道这是从哪里来的吗 多谢 节点错误 SyntaxError Unexpected end of input at Object parse native 我解析主体的答案 然
  • SQL 代理:设置最大执行时间

    下午 我在 MS 2K8 BI 服务器上运行多个 SQL 代理作业 其中一些每天运行一次 其他每小时运行一次 每两分钟运行一次 另一个进程的心跳监视器 还有一个应用程序可以全天候每隔几分钟导入一次数据 有时 更新和报告的某些组合会发生冲突
  • 使用 Facebook sdk 发布嵌入的 YouTube 链接

    当您有意在 FB 上分享 YouTube 链接时 它会自动将 YouTube 播放器嵌入到您的墙上 如下所示 但是 当我尝试使用发布相同的视频时FB sdk HelloFacebookSampleActivity gt postStatus
  • 如何从 C# winform 应用程序检索屏幕分辨率?

    如何检索我的 C Winform 应用程序运行时的屏幕分辨率 您是否只需要标准应用程序使用的区域 即排除 Windows 任务栏和停靠窗口 如果是这样 请使用Screen WorkingArea 属性 否则 使用屏幕边界 如果有多个显示器
  • 嵌入式 Facebook Like-Box 不允许我设计它。为什么?

    我正在尝试在我的网站页面上放置一个 Facebook Like Box 然后通过我自己的 CSS 对其进行样式设置 主要是为了增加 div stream content 的高度 这个想法是让 FB feed 充当新闻 feed 但我不希望用
  • Rails 卷曲语法

    我可以从我的 Rails 应用程序运行以下命令 Hash from xml x curl d admin true http localhost 8888 rescue nil 现在我想用变量替换 admin true 如果我有 x adm
  • 为什么数组大小为 1 [重复]

    这个问题在这里已经有答案了 可能的重复 C 编程语言中数组的大小 我正在尝试编写一个函数 如果数组中有值则返回 1 这是代码 int inArrayInt int iVal int iArray int i int arrayL sizeo
  • 使用 Python BeautifulSoup 查找页数

    我想从 Steam 页面中提取总页码 本例中为 11 我相信以下代码应该可以工作 返回 11 但它返回一个空列表 就像如果没有找到一样paged items paging pagelink class import requests imp
  • 在自定义 JsonConverter 中,如何确定 Utf8JsonReader 数字标记是小数还是长整型?

    我有这个json转换器需要将给定的属性值转换为小数或长整型 具体取决于该值 但我似乎无法确定属性值何时为小数或长整型 因为 tokentype 只能检测数字 我该如何解决这个问题吗 public override IDictionary
  • 设置捆绑包的自定义视图控制器?

    我有一个带有设置视图的应用程序 可以从远程服务器动态加载设置 运行良好 我还想在 iPhone 设置中提供这些功能 但设置包似乎仅限于加载并保存到本地 NSUserDefaults 的简单键值 有没有办法为此指定自定义视图 设置包基于 pl
  • NSAttributedString,整体更改字体但保留所有其他属性?

    假设我有一个NSMutableAttributedString 该字符串有多种多样的mix整个格式化 这是一个例子 这个字符串是hell to change in iOS it really sucks 然而 字体本身并不是您想要的字体 我