Изменение точки привязки моего CALAYER перемещает представление

Я хочу измениться anchorPoint, но сохраните представление в том же месте. Я попробовал NSLog- луг self.layer.position и self.center и они оба остаются такими же независимо от изменений в точке привязки. Все же мои перемещения представления!

Какие-либо подсказки относительно того, как сделать это?

self.layer.anchorPoint = CGPointMake(0.5, 0.5);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
self.layer.anchorPoint = CGPointMake(1, 1);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);

Вывод:

2009-12-27 20:43:24.161 Type[11289:207] center point: 272.500000 242.500000
2009-12-27 20:43:24.162 Type[11289:207] center point: 272.500000 242.500000
127
задан rounak 10 May 2015 в 14:21
поделиться

2 ответа

Раздел Layer Geometry and Transforms Руководства по программированию анимации ядра объясняет связь между положением CALayer и свойствами anchorPoint. В основном, положение слоя задается с точки зрения расположения точки привязки слоя. По умолчанию, точкой привязки слоя является (0.5, 0.5), которая лежит в центре слоя. Когда вы устанавливаете положение слоя, вы устанавливаете положение центра слоя в системе координат его суперслойного слоя.

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

Возможно, вы даже сможете учесть вращение таким образом, используя CGPointApplyAffineTransform() с CGAffineTransform вашего UIView.

.
137
ответ дан 24 November 2019 в 00:40
поделиться

Ключом к решению этой проблемы стало использование свойства кадра, которое, как ни странно, единственное, что меняется.

Swift 2

let oldFrame = self.frame
self.layer.anchorPoint = CGPointMake(1, 1)
self.frame = oldFrame

Swift 3

let oldFrame = self.frame
self.layer.anchorPoint = CGPoint(x: 1, y: 1)
self.frame = oldFrame

Затем я делаю свой размер, где он масштабируется от точки привязки. Затем я должен восстановить старую якорную точку;

Swift 2

let oldFrame = self.frame
self.layer.anchorPoint = CGPointMake(0.5,0.5)
self.frame = oldFrame

Swift 3

let oldFrame = self.frame
self.layer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.frame = oldFrame

EDIT: она исчезает, если вид повернут, так как свойство кадра не определено, если применена CGAffineTransform.

.
44
ответ дан 24 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: