Это код, который я использовал в своем проекте, чтобы создать одну окружность и одну маску прямоугольника в UIView, вы можете заменить строку UIBezierPath
тем же кодом дуги:
func createCircleMask(view: UIView, x: CGFloat, y: CGFloat, radius: CGFloat, downloadRect: CGRect){
self.layer.sublayers?.forEach { ($0 as? CAShapeLayer)?.removeFromSuperlayer() }
let mutablePath = CGMutablePath()
mutablePath.addArc(center: CGPoint(x: x, y: y + radius), radius: radius, startAngle: 0.0, endAngle: 2 * 3.14, clockwise: false)
mutablePath.addRect(view.bounds)
let path = UIBezierPath(roundedRect: downloadRect, byRoundingCorners: [.topLeft, .bottomRight], cornerRadii: CGSize(width: 5, height: 5))
mutablePath.addPath(path.cgPath)
let mask = CAShapeLayer()
mask.path = mutablePath
mask.fillRule = kCAFillRuleEvenOdd
mask.backgroundColor = UIColor.clear.cgColor
view.layer.mask = mask
}
Передайте свой тот же UIView,удаляет предыдущие слои и применяет новые маски к тому же UIView.
Здесь mask.fillRule = kCAFillRuleEvenOdd
важно.Если вы заметили, что есть 3 mutablePath.addPath()
функций, то, что делает kCAFillRuleEvenOdd
, сначала создает отверстие с дугой, затем добавляет Rect границы этого вида, а затем еще одну маску для создания 2-го отверстия.