gpt4 book ai didi

iphone - 如何通过更改突出显示颜色突出显示 CoreText?

转载 作者:可可西里 更新时间:2023-11-01 04:48:53 24 4
gpt4 key购买 nike

我有一个 UIView 的子类,它实现了绘制 CoreText 的代码。在应用程序中,该 UIView 绘制在 UIScrollView 内。这是我目前在 drawRect 中使用的代码:渲染 NSAttributedString:

CGContextRef context = UIGraphicsGetCurrentContext();

float viewHeight = self.bounds.size.height;
CGContextTranslateCTM(context, 0, viewHeight);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0, 1.0));

CGMutablePathRef path = CGPathCreateMutable();
CGRect bounds = CGRectMake(PADDING_LEFT, -PADDING_TOP, self.bounds.size.width-20.0, self.bounds.size.height);
CGPathAddRect(path, NULL, bounds);

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFMutableAttributedStringRef)attrString);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
CFRelease(framesetter);
CFRelease(path);
CTFrameDraw(frame, context);

在我的 NSAttributedString 中,我有某些文本属性来为文本着色。

我需要帮助的是概念上的,这应该如何完成?我对绘制框架、图层等的各种方法感到困惑。我尝试查看了几本书和其他资源,但我觉得我缺少一些基本的东西。

以下是我的要求:
  • 高光显然需要在方向改变时重新绘制到新位置。
  • 突出显示颜色需要能够在单个突出显示的基础上以编程方式更改。
  • 理想情况下,我不想在更改一个突出显示的突出显示颜色时重新绘制整个 CoreText UIView。
  • 各个 Rects 必须能够组合在一起以形成单个高光,因为高光可以覆盖超出单个 CTLine 的范围。
  • 最终,我想在 CoreText View 上实现 UIMenuController 所以我相信必须在 CoreText UIView 下绘制高光?

  • 我将不胜感激任何帮助。

    这是我迄今为止尝试过的:

    我添加了一个新的 UIView 作为 UIScrollView 的 subview 以包含亮点。然后我为高光本身添加单独的 UIViews。当我创建虚拟的“测试”高光时,它们在 CoreText View 下正确显示。我还可以轻松更改高光颜色。但是,当我从 CoreText View 中获取有关线条的实际信息以创建真正的高光时,它返回零线。这可能是因为 drawRect 尚未完成绘制还是其他原因?

    以下是一些问题:
  • 我是否应该将 UIView 作为 subview 添加到 UIScrollView 以包含所有突出显示以及每个突出显示的附加 subview ?然后,将每个突出显示的 UIView 存储在嵌套的 NSArray 中?
  • 如果我更改 CoreText UIView 下方突出显示的颜色,是否会导致整个 UIView 被重绘?如果是这样,我该如何设计?
  • 确实,如果我希望 CoreText UIView 接收 UIMenuController 的输入,我必须将高亮对象放置在 CoreText UIView 下方?

  • 我见过这个开源项目:

    https://github.com/Cocoanetics/NSAttributedString-Additions-for-HTML

    这是惊人的功能,但它比我需要的要复杂和详细得多。代码使用 CoreText 渲染每个单独的字形运行并允许突出显示,这很棒。但是,我试图保持我的代码简单和轻量级。我对 CoreGraphics、CoreAnimation 或 CoreText 知之甚少。

    我也看到了这个问题:

    Core Text - Get Pixel Coordinates from NSRange

    问题的答案提供了确定给定行中给定范围的 Rect 边界的调用。我想我可以弄清楚这些电话。

    更新

    这是我现在所做的。我确定这是错误的,但这是我能找到的让它工作的唯一方法......
  • 创建一个 UIView 作为容器添加到 UIScrollView 作为 subview 。
  • 将 UIView 传递给 CoreTextView。我还将字符串范围数组传递给 CoreTextView 以指示应突出显示哪些字符串。
  • 添加 CoreTextView 作为 UIScrollView 的 subview 。这样,UIView 就在 CoreTextView 之下。
  • 在 CoreTextView 的 drawRect: 函数中,我绘制了 CoreText。然后我调用一个函数来计算高光。
  • 每个 NSRange 都根据行进行检查,并计算行中每个匹配项的 CGRect。
  • CGRect 用于创建一个新的 UIView。该 UIView 被添加为 UIView 容器的 subview 。它还被添加到 NSArray 中,以便我可以跟踪它并根据需要更改单个高光的高光颜色。

  • 每次将突出显示添加到容器或更改颜色时,这不会调用 drawRect。但是,我知道这不是理想的解决方案。此解决方案的问题:
  • 当 UIViewController 在 CoreTextView 上调用 setNeedsDisplay 时,无法知道它何时完成绘制。我仍然无法找到一种方法来进行回调以告诉 ViewController 可以继续执行下一个任务。
  • 通过将 UIViews 添加到另一个容器 UIView,drawRect 在技术上是在它自己的 rect 之外绘制项目,我知道这是不可以的。
  • 我敢肯定这不是执行此操作的最高效方式,尽管它似乎工作得很好。
  • 最佳答案

    您的基本想法对于突出显示来说还不错。我不知道这是否真的比在绘制时突出显示字形更容易,但这不是一个坏主意,并且可以轻松打开和关闭突出显示,因此非常好。

    与其创建大量 View ,不如将核心文本放在 CALayer 上反而。然后你可以创建额外的高亮层来覆盖文本。这将所有内容都保留在一个 View 中。层比 View 便宜得多。如果您只是想进行“荧光笔”样式的突出显示,那么您只需设置 backgroundColorframe对于图层,你就完成了。

    关于iphone - 如何通过更改突出显示颜色突出显示 CoreText?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6779051/

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