Забудьте о чертеже и просто подумайте, как центрировать путь в слое фигуры известного размера. Вот преднамеренная ошибка:
let path = UIBezierPath(ovalIn: CGRect(x: 50, y: 50, width: 50, height: 50))
let lay = CAShapeLayer()
lay.frame = CGRect(x: 40, y: 40, width: 200, height: 200)
lay.backgroundColor = UIColor.red.cgColor
lay.path = path.cgPath
self.view.layer.addSublayer(lay)
Мы получаем это:
Залитый круг не центрирован в слое красной формы , Хорошо, мы знаем почему, потому что мы знаем безье, который создал закрашенный круг. Но допустим, мы не знаем это. Мы все еще можем центрировать фигуру в слое фигуры, например:
let path = UIBezierPath(ovalIn: CGRect(x: 50, y: 50, width: 50, height: 50))
let lay = CAShapeLayer()
lay.frame = CGRect(x: 40, y: 40, width: 200, height: 200)
lay.backgroundColor = UIColor.red.cgColor
let cgpath = path.cgPath
let box = cgpath.boundingBoxOfPath
let xtarget = (lay.bounds.width - box.width)/2
let ytarget = (lay.bounds.height - box.height)/2
let xoffset = xtarget - box.minX
let yoffset = ytarget - box.minY
var transform = CGAffineTransform(translationX: xoffset, y: yoffset)
let cgpath2 = cgpath.copy(using: &transform)
lay.path = cgpath2
self.view.layer.addSublayer(lay)
Результат:
Итак, учитывая CGPath, и учитывая слой формы, конечные границы которого известны, вы можете использовать эту технику для центрирования пути в слое формы. И это те обстоятельства, которые идеально подходят для вашего варианта использования.