你想用的kCGBlendModeDestinationOut
混合模式(與純色行程繪製的路徑。)
According to the docs,此混合模式執行以下操作:
R = d *(1 - 薩)
哪裏...
R是預乘的結果。
S是源色彩,並且包括阿爾法
d是目標的顏色,並且包括阿爾法
鐳,SA和DA的R,S,和d的alpha分量
這種方式,具有固體筆劃顏色一起使用時,所繪製的路徑將是「透明」。
原因clearColor
不會爲你工作是因爲默認的混合模式爲添加劑,因此產生的顏色會用的0
在它的alpha繪製顏色的影響。另一方面,DestinationOut
是減法。
所以你想要做的事像下面這樣:
override func drawRect(rect: CGRect) {
let clippingPath = UIBezierPath()
let context = UIGraphicsGetCurrentContext() // get your current context
// draw your background color
UIColor.greenColor().set();
CGContextFillRect(context, bounds)
CGContextSaveGState(context) // save the current state
CGContextSetBlendMode(context, .DestinationOut) // change blend mode to DestinationOut (R = D * (1-Sa))
// do 'transparent' drawing
UIColor.whiteColor().set();
clippingPath.moveToPoint(CGPoint(x: 10, y: CGRectGetHeight(self.bounds)/2))
clippingPath.addLineToPoint(CGPoint(x: CGRectGetWidth(self.bounds) - 10, y: CGRectGetHeight(self.bounds)/2))
clippingPath.lineWidth = 6
clippingPath.lineCapStyle = .Round
clippingPath.stroke()
CGContextRestoreGState(context) // restore state of context
// do further drawing if needed
}
注:
你得視圖的opaque
屬性此設置爲false
到工作,否則UIKit會認爲它有不透明的內容。例如:
override init(frame: CGRect) {
super.init(frame: frame)
opaque = false
}
謝謝。我已經嘗試過,但現在我得到了一條黑線。我已經在紅色uiview的頂部添加了這個視圖,期望看到一條紅線,但它仍然顯示爲黑色 – Tomus85
啊是的,我忘了提及你應該將'UIView'的'backgroundColor'設置爲'clearColor '。然後你可以在'drawRect'中繪製你的背景顏色。這樣做應該解決問題。 – Hamish
我試過了,似乎沒有修復它 – Tomus85