Ответ 1
tl; dr: в вашем слое формы отсутствует фрейм (возможно, ограничивающий прямоугольник его пути).
Путаница возникает из-за того, что вращающийся слой не имеет рамки. Это означает, что его размер равен 0⨉0. Это в сочетании с тем, что слой формы позволяет рисовать фигуру за пределами ее границ, делает ее похожей на то, что вращение происходит вокруг внешней точки. Но это не так.
Проблема
Без каких-либо изменений в точку привязки, преобразование происходит относительно центра слоя собственных границ. Для слоя без размера центр совпадает с началом ((x+width/2, y+height/2)
совпадает с (x, y)
, когда оба width
и height
равны 0
).
Локальное происхождение (относительно границ слоя) также находится там, где путь обращается относительно. Точка (0, 0)
для пути находится в начале слоя формы.
Если бы мы отображали центр (и в этом случае источник) слоя, это было бы так.
Это также точка, в которой форма вращается вокруг.
Решение...
По сути, это два способа решения этой проблемы, заставляя ее вращаться вокруг центра круга. Один из них - изменить путь так, чтобы центр окружности находился в (0,0), в начале координат. Другое решение, которое я обычно предпочитаю, - это дать размеру слоя, который соответствует размеру его пути, ограничивающий прямоугольник:
circleLayer.bounds = CGPathGetBoundingBox(circle.CGPath);
Здесь я показываю слой с очень светло-серым цветом фона:
Мне иногда кажется полезным придать слою формы фоновый цвет во время разработки в качестве инструмента отладки, чтобы я мог видеть, что его кадр соответствует моим ожиданиям.
Обратите внимание, что при изменении границ слоя или вида он изменяется относительно его положения. Это означает, что центральная точка остается прежней, а начало координат перемещается, что означает, что путь будет эффективно перемещаться.
Теперь, когда слой имеет размер, а центр границ совпадает с центром круга, он будет выглядеть так, как бы круг вращается вокруг него, когда вы вращаете слой формы.
Когда вы видите, что все работает, вы можете снова удалить цвет фона.