2015-09-05 136 views
0

我在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

回答

1

为什么中风两次,如果你只想要一个颜色?无论如何,你可能需要明确地设置图形上下文的混合模式。 NSGraphicsContext具有compositingOperation属性

CoreGraphics和NS AppKit包装中的许多绘图命令也可以采用合成操作参数。

此外,还应确保您的看法也以1.0的alpha与阿尔法非不透明看法小于1.0可复合

最后还有基金会函数来获取积分rects。 您可能需要查看这些内容并试验笔划宽度。如果绘图边缘落在子像素边界或子点边界上,则由于物理限制,抗混叠可能会发生混合颜色。

+0

>>为什么中风两次,如果你只想要一个颜色? –

+0

如果你只想要一种颜色,为什么要抚摸两次?这只是一个测试代码。实际上,我正在实施一个图表框架。用户可以指定轴的边框颜色和颜色以及轴交叉的点。首先我画边界然后画轴。如果一个轴的颜色与边框颜色不同,那么它将以所需的颜色绘制,但只有在它不与边框重合时才会绘制。如果它与经常出现的边界重合,则结果将是边界和轴颜色的混合。这不是用户所要求的。 –

0

“NSGraphicsContext有compositingOperation属性”。

在我问这里的问题之前,我已经尝试了compositeOperation()。使用CompositeCopy规格时,我会得到相同的结果。我不认为compositeOperation()会影响stroke()的结果。

“CoreGraphics在许多绘图命令和NS了AppKit包装也可以采取一个合成操作参数”

我不知道,我明白绘图命令你的意思。我使用Apple推荐的NSBezierPath.stroke()。

“还确保您的视图也是以1.0的α与α非不透明视图小于1.0可复合材料”

新创建的视图具有默认的1.0的α。我不会改变它。

“最后还有基金会函数来获取积分rects”

我使用积分rects在测试代码上面。

总结,问题仍然存在,如何绘制两条线在彼此的顶部,并获得最后绘制的线的颜色?

今天晚些时候我发现了解决方案。 Uchuugaka是在正确的轨道上。这是抗混叠,使颜色混合。即使是纯粹的水平和垂直线条。解决的办法是打开反锯齿关闭,两条线路:

let g = NSGraphicsContext.currentContext()! 

g.saveGraphicsState() 

g.shouldAntialias = false 

// Do the drawing 

g.restoreGraphicsState() 

感谢/的Mikael

+0

只要给你工具。 CoreGraphics及其NS和UI包装并不难,只是没有超级文档。苹果工程师阅读旧的,但仍然非常相关的石英图书是值得的。 – uchuugaka