Это заняло немного больше усилий, чем я ожидал, и решение не было очевидным ... пока я не нашел его, тогда это было похоже, о, да, конечно: /
Основная идея состоит в том, что вы хотите «вырезать» часть существующего пути, решение не было очевидным, поскольку UIBezierPath
не предоставляет метод «вычитания» или «удаления». Вместо этого вам нужно «изменить» путь, например ...
let path = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 200, height: 200))
path.append(UIBezierPath(ovalIn: CGRect(x: 50, y: 50, width: 100, height: 100)).reversing())
path.append(UIBezierPath(ovalIn: CGRect(x: 75, y: 75, width: 50, height: 50)))
И так как фрагменты "вне контекста" редко бывают полезны, я использовал эту площадку для тестирования (укажите собственное изображение) ...
import UIKit
import Foundation
import CoreGraphics
let image = UIImage(named: "Profile")
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
let backgroundView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
backgroundView.backgroundColor = UIColor.green
backgroundView.addSubview(imageView)
imageView.contentMode = .scaleAspectFit
imageView.image = image
imageView.layer.cornerRadius = 100
let shapeLayer = CAShapeLayer()
let path = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 200, height: 200))
path.append(UIBezierPath(ovalIn: CGRect(x: 50, y: 50, width: 100, height: 100)).reversing())
path.append(UIBezierPath(ovalIn: CGRect(x: 75, y: 75, width: 50, height: 50)))
shapeLayer.path = path.cgPath
shapeLayer.fillColor = UIColor.red.cgColor
shapeLayer.frame = imageView.bounds
imageView.layer.mask = shapeLayer
backgroundView
И мои результаты ...
Зеленый цвет относится к backgroundView
, на котором расположен UIImageView
Теперь, если вы предпочитаете что-то более похожее ...
Тогда просто избавьтесь от второго append
утверждения, path.append(UIBezierPath(ovalIn: CGRect(x: 75, y: 75, width: 50, height: 50)))