swift - 将 NSMutableAttributedString 应用于文本范围
问题描述
我有一些文字:
新内容 - 今天发布 | 10 分钟阅读
我想将样式应用于管道之后的所有内容,包括管道,所以| 10 min read
我已经尝试过以下方法,但它只有管道本身的样式。
func makeAttributedText(using baseString: String?) -> NSMutableAttributedString? {
guard let baseString = baseString else { return nil }
let attributedString = NSMutableAttributedString(string: baseString, attributes: nil)
let timeToReadRange = (attributedString.string as NSString).range(of: "|")
attributedString.setAttributes([NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)], range: timeToReadRange)
return attributedString
}
解决方案
而不是获取单个字符的范围,而是获取字符的索引并创建从该索引到字符串末尾的范围。
func makeAttributedText(using baseString: String?) -> NSMutableAttributedString? {
guard let baseString = baseString else { return nil }
let attributedString = NSMutableAttributedString(string: baseString, attributes: nil)
guard let timeToReadIndex = baseString.firstIndex(of: "|") else { return attributedString }
let timeToReadRange = NSRange(timeToReadIndex..., in: baseString)
attributedString.setAttributes([NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)], range: timeToReadRange)
return attributedString
}
笔记:
Swift 有专门的方法来转换Range<String.Index>
为NSRange
. 没有理由将桥投射到NSString
推荐阅读
- python - 导入自己的模块问题:没有名为'xx'的模块
- python - 在 kivymd 上重新运行应用程序后如何保存和加载数据
- python - 在 for 循环后退出
- angular - @angular/material 中的元素未正确显示
- linux - 为什么会出现此错误“运行特权模式时必须在主机命名空间中运行容器”?
- c++ - unordered_map 的 Unordered_map 与对键 C++ 的自定义散列函数?
- python - Pandas:使用 groupby 然后 shift 的更快方法?
- regex - 如何删除ip地址和端口前后的所有内容?
- r - R取消嵌套多列
- gridjs - 如何在每秒更新数据的情况下使用 Grid.js