【发布时间】: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