首页 > 解决方案 > 将 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
  }

标签: swiftuilabelnsmutableattributedstring

解决方案


而不是获取单个字符的范围,而是获取字符的索引并创建从该索引到字符串末尾的范围。

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


推荐阅读