2015-09-05 111 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

相關問題