Нет прямого способа получить различия UIBezierPath в качестве нового пути на iOS.
Тестовый случай
private func path2() -> UIBezierPath {
return UIBezierPath(rect: CGRect(x: 100, y: 50, width: 200, height: 200))
}
private func path1() -> UIBezierPath {
return UIBezierPath(rect: CGRect(x: 50, y: 100, width: 200, height: 200))
}
Начальная точка: просто показать, какаяпуть представляет собой что: путь 1 желтый и путь 2 зеленый:
Возможность 1
ВыВозможно, вы уже видели эту возможность: в ссылке, которую вы упомянули в своем вопросе, есть и умное решение, если вам нужно только выполнить операцию заполнения.
Код был взят из этого ответа (по ссылке, которую выотправлено) https://stackoverflow.com/a/8860341 - преобразовано только в Swift:
func fillDifference(path2: UIBezierPath, path1: UIBezierPath) {
let clipPath = UIBezierPath.init(rect: .infinite)
clipPath.append(path2)
clipPath.usesEvenOddFillRule = true
UIGraphicsGetCurrentContext()?.saveGState()
clipPath.addClip()
path1.fill()
UIGraphicsGetCurrentContext()?.restoreGState()
}
Таким образом, это заполняет путь, но не возвращает UIBezierPath, что означает, что вы не можете применять контуры, фоны, ширину контуров и т. д.., потому что результат не является UIBezierPath.
Это выглядит так:
Возможность 2
Вы можете использовать стороннюю библиотеку, например, от автора по имени Адам Вульф, здесь: https://github.com/adamwulf/ClippingBezier.
Библиотека написана на Objective-C, но может быть вызвана из Swift.
В Swift это выглядело бы так:
override func draw(_ rect: CGRect) {
let result = self.path1().difference(with: self.path2())
for p in result ?? [] {
p.stroke()
}
}
Если вы хотите использовать эту библиотеку, вы должны заметить небольшую подсказку: в Другие флаги компоновщика в настройках проекта, какописанный в readme, «-ObjC ++ -lstdc ++» должен быть добавлен, в противном случае он будет построен без нареканий, но не будет молча загружать фреймворки и, в конечном итоге, аварийно завершить работу, поскольку категории UIBEzierPath не найдены.
Результатвыглядит следующим образом:
Таким образом, это действительно даст желаемый результат, но вам придется использовать стороннюю библиотеку.