画线在彼此的顶部

时间:2015-09-05 17:28:13

标签: cocoa stroke nsbezierpath nscolor

我有一个问题,在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

2 个答案:

答案 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