Uiview `UIBezierPath.fill()`不填充'draw()的内部`

Uiview `UIBezierPath.fill()`不填充'draw()的内部`,uiview,uikit,core-graphics,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:

我正在从半透明的
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!
}

你不是在用同样的东西画画

报告说:

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

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

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

但是,当您调用
path.fill()
时,它在上下文中使用默认的混合模式,即
CGBlendMode.normal
。它将填充颜色绘制在上下文中已有的内容上。由于填充颜色是清晰的,因此没有可见效果

试试这个:

UIColor.clear.setFill()
path.fill(with: CGBlendMode.copy, alpha: 1.0)
或者这个:

UIColor.clear.setFill()
UIGraphicsGetCurrentContext()?.setBlendMode(CGBlendMode.copy)
path.fill()
或者,您甚至可以在一行中完成:

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

你不是在用同样的东西画画

报告说:

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

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

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

但是,当您调用
path.fill()
时,它在上下文中使用默认的混合模式,即
CGBlendMode.normal
。它将填充颜色绘制在上下文中已有的内容上。由于填充颜色是清晰的,因此没有可见效果

试试这个:

UIColor.clear.setFill()
path.fill(with: CGBlendMode.copy, alpha: 1.0)
或者这个:

UIColor.clear.setFill()
UIGraphicsGetCurrentContext()?.setBlendMode(CGBlendMode.copy)
path.fill()
或者,您甚至可以在一行中完成:

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