【问题标题】:Applying NSMutableAttributedString to a range of text将 NSMutableAttributedString 应用于文本范围
【发布时间】:2020-06-01 06:08:49
【问题描述】:

我有一些文字:

新内容 - 今天发布 | 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
  }

【问题讨论】:

  • as timeToReadRange 你只定义了“|”的范围(attributedString.string as NSString).range(of: "|")你应该创建一个从“|”开始的范围结束索引。
  • 这就是我不确定该怎么做

标签: swift uilabel nsmutableattributedstring


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 2017-08-21
    • 2011-02-22
    • 2018-10-27
    • 2022-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多