在drawRect中绘制透明的UIBezierPath行

时间:2016-03-01 13:58:43

标签: ios core-graphics drawrect uibezierpath

我正在尝试在drawRect方法中实现透明度路径。这是我创建的简单代码:

override func drawRect(rect: CGRect) {
    let clippingPath = UIBezierPath()

    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()
}

这就是结果:

enter image description here

是否有办法尝试保持背景稳固但路径线透明。如果我将第二行更改为UIColor.clearColor().set()似乎没有发生任何事情,我只会获得完整的纯色背景(在这种情况下为黑色。

2 个答案:

答案 0 :(得分:2)

您希望使用kCGBlendModeDestinationOut(和纯色笔画)的混合模式绘制路径。

According to the docs,此混合模式执行以下操作:

  

R = D *(1 - Sa)

WHERE ...

  • R是预乘结果。

  • S是源颜色,包括alpha

  • D是目标颜色,包括alpha

  • Ra,Sa和Da是R,S和D的alpha分量

这样,当使用实心笔触颜色时,绘制的路径将是“透明的”。

clearColor对你有用的原因是因为默认的混合模式是添加,因此结果颜色不会受到绘图的影响,其颜色为alpha 0过了它。另一方面,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
}

答案 1 :(得分:0)

另一种可能更简单的方法是将笔画set db = CurrentDb for each idx in db.TableDefs("tblFoo").Indexes : ? idx.name : next id PrimaryKey 添加为要显示的视图的CAShapeLayer,然后将颜色叠加层放在另一个视图中被掩盖的观点背后。因此,只要屏蔽了标记的视图,就会出现纯色。