Якорь не работает, потому что новый слой не имеет frame
. Если вы установите это, это работает:
let rect = CGRect(x: 0, y: 0, width: 150, height: 150)
let path = UIBezierPath(roundedRect: rect, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 39.5, height: 39.5))
let shapeLayer = CAShapeLayer()
shapeLayer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
shapeLayer.frame = rect
shapeLayer.position = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
shapeLayer.fillColor = UIColor.blue.cgColor
shapeLayer.path = path.cgPath
view.layer.addSublayer(shapeLayer)
Кроме того, вы можете просто установить источник path
:
let size = CGSize(width: 150, height: 150)
let origin = CGPoint(x: view.bounds.midX - size.width / 2,
y: view.bounds.midY - size.height / 2)
let path = UIBezierPath(roundedRect: CGRect(origin: origin, size: size), byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 39.5, height: 39.5))
let shapeLayer = CAShapeLayer()
shapeLayer.fillColor = UIColor.blue.cgColor
shapeLayer.path = path.cgPath
view.layer.addSublayer(shapeLayer)
Кстати, обратите внимание, что я не ссылаюсь на center
, потому что , как документы говорят: «Центральная точка указана в точках в системе координат ее суперпредставления».
Всегда используйте bounds
(а если вам нужен центр этого, midX
и midY
bounds
), потому что это всегда будет в системе координат рассматриваемого вида. В этом случае это просто не имеет большого значения, но мы должны отметить, что середина bounds
и center
в суперпредставлении - это две совершенно разные вещи.