我有一个问题,在OS X中相互重叠绘制线条。下面的代码绘制一个红色矩形,然后绘制绿色的相同矩形。我希望结果是一个绿色矩形,因为它是最后绘制的。我得到红色和绿色的混合物 - 橄榄绿。在这种情况下如何修改代码以获得绿色矩形?
import Cocoa
class TestView : NSView {
override func drawRect (dirtyRect : NSRect) {
super.drawRect (dirtyRect)
let rect = NSRect (x : 100 , y : 200 , width : 100 , height : 100)
var p = NSBezierPath ()
var c = NSColor (red : 1 , green : 0 , blue : 0 , alpha : 1)
c.set ()
p.appendBezierPathWithRect (rect)
p.stroke ()
p = NSBezierPath ()
c = NSColor (red : 0 , green : 1 , blue : 0 , alpha : 1)
c.set ()
p.appendBezierPathWithRect (rect)
p.stroke ()
}
}
感谢/的Mikael
答案 0 :(得分:1)
如果你只需要一种颜色,为什么要两次?无论如何,您可能需要显式设置图形上下文的混合模式。 NSGraphicsContext有一个compositingOperation属性
CoreGraphics中的许多绘图命令和NS AppKit包装器也可以采用合成操作参数。
同时确保您的视图的alpha值为1.0,非透明视图的alpha值小于1.0可能会合成
最后,有基础功能可以获得积分。 您可能希望查看这些并尝试笔划宽度。如果您的绘图边缘落在子像素边界或子点边界上,则由于物理限制,可能会出现混色的混叠。
答案 1 :(得分:0)
" NSGraphicsContext有一个compositingOperation属性"。
在我问这里的问题之前,我尝试过compositeOperation()。使用CompositeCopy规范时,我得到相同的结果。我不认为compositeOperation()会影响stroke()的结果。
" CoreGraphics中的许多绘图命令和NS AppKit包装器也可以采用合成操作参数"
我不确定我理解你的绘图命令是什么意思。我使用Apple推荐的NSBezierPath.stroke()。
"同时确保您的视图的alpha值为1.0,非透明视图的alpha值小于1.0,可以合成"
默认情况下,新创建的视图的alpha值为1.0。我不改变它。
"最后有一些基础功能可以获得积分,#34;
我在上面的测试代码中使用了整数。
总结一下,问题仍然存在,如何在彼此之上绘制2条线并获得最后绘制的线的颜色?
今天晚些时候我发现了解决方案。 Uchuugaka走在正确的轨道上。正是抗锯齿使颜色融为一体。甚至是纯粹的水平和垂直线条。解决方案是关闭两条线的抗锯齿:
let g = NSGraphicsContext.currentContext ()!
g.saveGraphicsState ()
g.shouldAntialias = false
// Do the drawing
g.restoreGraphicsState ()
感谢/的Mikael