Не удается изменить AnchorPoint для CAShapeLayer iOS Swift
Вот отрывок из моего пользовательского класса, который рисует некоторую графику. функция drawTick()
добавляет CAShapeLayer
с синим прямоугольником на мой GameTimer
UIView
:
class GameTimer: UIView {
var tick = CAShapeLayer()
...
init(){
super.init(frame: CGRect(x: 0, y: 0, width: 200, height: 200)
}
...
func drawTick() {
tick.path = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 50, height: 50)).cgPath
tick.fillColor = UIColor.blue.cgColor
self.layer.addSublayer(tick)
tick.anchorPoint = CGPoint(x: 0.5, y: 0.5)
tick.position = CGPoint(x: bounds.midX, y: bounds.midY)
tick.transform = CATransform3DMakeRotation(0.degreesToRadians, 0, 0, 1)
}
...
}
extension Double {
var degreesToRadians : CGFloat {
return CGFloat(self) * CGFloat(M_PI) / 180.0
}
}
Изменение угла поворота на 45 градусов
tick.transform = CATransform3DMakeRotation(45.degreesToRadians, 0, 0, 1)
дает следующий результат:
Здесь я вижу, что заявленная точка привязки не влияет на tick
слой - он должен быть в центре синего прямоугольника. Вращение вращается вокруг точки с координатами (x: 0, y: 0) - левый верхний угол синего прямоугольника - tick.position
, Вопрос - почему заявлен anchorPoint
позиция не относится к tick
слой? Это странное поведение, если предположить, что положение по умолчанию anchorPoint
должно быть уже (x: 0.5, y: 0.5)
без ручного переопределения, но если я уберу это переопределение - ничего не изменится.
1 ответ
tick
слой не имеет размера. Причина, по которой он выглядит правильно, заключается в том, что путь не обрезан до границ (то есть нарисован за пределами границ).
Если вы даете форму слоя одинаково bounds
как прямоугольник круга, тогда вы сможете увидеть вращение вокруг центра.