Я хотел применить UIEffectView
с размытием поверх табличного представления, но в каждой ячейке просвечивали круглые UIImageView
объекты.Я использовал маску и адаптировал решение из этого ответа , чтобы создать метод, который бы итеративно вырезал круги над каждой ячейкой:
func cutCircle(inView view: UIView, rect1: CGRect, rect2: CGRect?) {
// Create new path and mask
let newMask = CAShapeLayer()
// Create path to clip
let newClipPath = UIBezierPath(rect: view.bounds)
let path1 = UIBezierPath(ovalIn: rect1)
newClipPath.append(path1)
if let rect2 = rect2 {
let path2 = UIBezierPath(ovalIn: rect2)
//FIXME: Need a way to get a union of both paths!
//newClipPath.append(path2)
}
// If view already has a mask
if let originalMask = view.layer.mask, let originalShape = originalMask as? CAShapeLayer, let originalPath = originalShape.path {
// Create bezierpath from original mask's path
let originalBezierPath = UIBezierPath(cgPath: originalPath)
// Append view's bounds to "reset" the mask path before we re-apply the original
newClipPath.append(UIBezierPath(rect: view.bounds))
// Combine new and original paths
newClipPath.append(originalBezierPath)
}
// Apply new mask
newMask.path = newClipPath.cgPath
newMask.fillRule = .evenOdd
view.layer.mask = newMask
}
Эта функция вызывается для UIEffectView
длякаждая видимая ячейка таблицы, используя: for cell in tableView.visibleCells()
.Он добавляет новый круг к маске.
Однако некоторые элементы имеют наложение значка меньшего круга, например:

Я добавил второй параметр CGRect
в метод выше, чтобы условно вырезать этот круг.Тем не менее, маска остается неизменной там, где два круга перекрываются, например:

Я посмотрел несколько ответов здесь, так как мне нужно было найтиспособ получить объединение двух UIBezierPath
объектов.Однако это оказалось очень сложно.Я не думаю, что смогу использовать контекст рисования, так как это UIEffectView
, а маску нужно сокращать итеративно.
Я пытался изменить правила заливки (.evenOdd
, .nonZero
), но этоне дает желаемого эффекта.
Есть ли какие-либо советы по объединению двух перекрывающихся UIBezierPath
в одну маску?
Общая цель - добиться этого эффекта с помощью последовательных ячеек таблицы, но некоторые значки будут иметь дополнительный круг.

Обратите внимание, что нижний значок имеет дополнительный круг, но он обрезан, и моя текущая техникавырезание этого дополнительного круга вызывает проблему, отмеченную выше, когда перекрытие не маскируется, как ожидалось.