`UIBezierPath.fill()`不填充`draw()`

时间:2018-01-26 02:09:15

标签: uiview uikit core-graphics

我正在用半透明的UIView切割一个矩形。当我使用UIRectFill()时,它按预期工作。但是,当我创建一个带圆角的UIBezierPath时,fill()似乎没有做任何事情。奇怪的是,在同一条路径上调用stroke()可以正常工作。

工作:

override func draw(_ rect: CGRect) {
    screenColor.set()
    UIRectFill(self.bounds)

    let viewfinderRect = CGRect(x: 50, y: 50, width: 100, height: 100)

    UIColor.clear.setFill()
    UIRectFill(viewfinderRect)  //Works!
}

不工作:

override func draw(_ rect: CGRect) {
    screenColor.set()
    UIRectFill(self.bounds)

    let viewfinderRect = CGRect(x: 50, y: 50, width: 100, height: 100)
    let path = UIBezierPath(roundedRect: viewFinderRect, cornerRadius:  10.0)

    UIColor.clear.setFill()
    path.fill()             // Does not work!
    //path.stroke()         // Works!
}

1 个答案:

答案 0 :(得分:3)

您没有使用相同的blend mode绘图。

documentation for UIRectFill说:

  

使用当前图形上下文的填充颜色和kCGBlendModeCopy混合模式填充指定的矩形。

(在Swift中,此混合模式的名称为CGBlendMode.copy。)

使用此混合模式时,指定的填充颜色将复制到上下文中,替换下面的任何内容。由于您的填充颜色很清晰,因此您可以有效地在视图中剪切一个洞。

但是,当您致电size_t时,它会在上下文中使用默认的混合模式,即path.fill()。这将填充颜色覆盖上下文中已有的颜色。由于您的填充颜色很清晰,因此没有明显效果。

试试这个:

CGBlendMode.normal

或者这个:

UIColor.clear.setFill()
path.fill(with: CGBlendMode.copy, alpha: 1.0)

或者您甚至可以在一行中完成:

UIColor.clear.setFill()
UIGraphicsGetCurrentContext()?.setBlendMode(CGBlendMode.copy)
path.fill()