gpt4 book ai didi

ios - 在 NSAttributedString (iOS7+) 中自定义下划线模式

转载 作者:可可西里 更新时间:2023-11-01 04:43:56 25 4
gpt4 key购买 nike

我正在尝试向 NSAttributedString 添加虚线下划线样式(在 iOS7+/TextKit 上)。当然,我尝试了内置的NSUnderlinePatternDot:

NSString *string = self.label.text;
NSRange underlineRange = [string rangeOfString:@"consetetur sadipscing elitr"];

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string];
[attString addAttributes:@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle | NSUnderlinePatternDot)} range:underlineRange];

self.label.attributedText = attString;

但是,由此产生的样式实际上是虚线而不是点线:

screenshot

我是否遗漏了一些明显的东西(NSUnderlinePatternReallyDotted?;))或者是否有自定义线点模式的方法?

最佳答案

我花了一些时间尝试使用 Text Kit 来使这个和其他类似的场景发挥作用。这个问题的实际 Text Kit 解决方案是子类化 NSLayoutManager 并覆盖 drawUnderline(forGlyphRange:underlineType:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:)

这是被调用以实际绘制 NSTextStorage 中的属性所请求的下划线的方法。以下是传入参数的说明:

  • glyphRange第一个字形的索引和后面要加下划线的字形的个数
  • underlineType NSUnderlineAttributeName 属性的 NSUnderlineStyle
  • baselineOffset边界框底部与所提供范围内字形的基线偏移之间的距离
  • lineFragmentRect 包围包含 glyphRange
  • 的整行的矩形
  • lineFragmentGlyphRange 构成包含 glyphRange
  • 的整行的字形范围
  • containerOrigin容器在其所属 TextView 中的偏移量

画下划线的步骤:

  1. 使用 NSLayoutManager.textContainer(forGlyphAt:effectiveRange:) 找到包含 glyphRangeNSTextContainer
  2. 使用 NSLayoutManager.boundingRect(forGlyphRange:in:) 获取 glyphRange 的边界矩形
  3. 使用 CGRect.offsetBy(dx:dy:)
  4. 偏移文本容器原点的边界矩形
  5. 在偏移边界矩形底部和基线之间的某处绘制自定义下划线(由 baselineOffset 确定)

关于ios - 在 NSAttributedString (iOS7+) 中自定义下划线模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25523910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com