【问题标题】:Why doesn't UIBezierPath strokeWithBlendMode do anything?为什么 UIBezierPath strokeWithBlendMode 不做任何事情?
【发布时间】:2012-12-04 05:42:38
【问题描述】:

我已经使用类似于this SO question 中显示的方法设置了一个绘图工具...我有一个 UIView 的子类,它跟踪触摸、创建 UIBezierPath 对象、将路径添加到数组中,然后绘制将它们放到drawRect中的视图上。该视图是透明的([UIColor clearColor], opaque=NO),并放置在以 PDF 和 Word 格式显示文档的 UIWebView 上。

我想使用这个工具来突出显示文本,所以我使用了带有 0.5 alpha 的黄色笔触颜色。这工作得相当好,但颜色使文本在重叠的地方看起来褪色。我正在阅读kCGBlendModeMultiply 混合模式的描述,并认为这将是完美的——它应该允许文本“穿透”突出显示颜色以获得更好的对比度。

但是,我看不出 kCGBlendModeNormal、kCGBlendModeMultiply 或我尝试过的任何随机混合模式之间有任何区别。这些真的有效吗,还是只在某些情况下有效?

这是我的 drawRect 代码:

- (void)drawRect:(CGRect)rect {
    for (UIBezierPath *path in self.paths) {
        [[UIColor colorWithRed:1 green:1 blue:0 alpha:0.5] setStroke]; // yellow
        //[path stroke]; // uses default blend mode
        [path strokeWithBlendMode:kCGBlendModeMultiply alpha:1.0]; // looks the same as above
    }
}

我尝试将颜色的 alpha 设置为 1.0,将 strokeWithBlendMode 方法的 alpha 参数设置为 0.5,但没有任何区别。我错过了什么吗?

【问题讨论】:

  • 为什么要倍增?叠加看起来更像你想要的。
  • 和我试过的其他模式一样,kCGBlendModeOverlay 没有可见的效果。
  • 嗯,他们确实工作,我自己用过。你确定文字和笔画在同一个CGContext中吗?如果它们是两个不同的视图,那么这是行不通的。
  • 不,文本在我的绘图视图下方的 UIWebView 中。是这个问题吗?
  • 我敢打赌。您没有可用的有关该层的信息。为每个 drawRect 调用计算每一层的成本太高了。因此,您基本上是针对清晰的颜色执行混合模式(这意味着始终相同)。您只能与上下文中已有的像素数据进行混合。

标签: ios drawing core-graphics alphablending


【解决方案1】:

就您的代码而言,您的文本处于完全不同的世界。当您输入drawRect: 时,您可以使用的是专门为您的视图和您的视图创建的CGContextRef。它不知道其他视图中的内容,因此您的所有混合都是针对一堆清晰像素进行的。

我会说只是将 alpha 降低一点,它看起来还可以。或者,您可以在文本后面画出笔触,使文本更加突出(不过这需要一些技巧)。

【讨论】:

  • 感谢您的解释。现在看起来还不错,如果可能的话,我只是想多加一点!
  • 没问题,我目前的项目(以及手绘模式)中也有一个用于 web 视图的突出显示系统,所以我一直在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2021-12-20
  • 2011-07-25
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多