我正在用半透明的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!
}
答案 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()