Я хочу измениться 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
Раздел Layer Geometry and Transforms Руководства по программированию анимации ядра объясняет связь между положением CALayer и свойствами anchorPoint. В основном, положение слоя задается с точки зрения расположения точки привязки слоя. По умолчанию, точкой привязки слоя является (0.5, 0.5), которая лежит в центре слоя. Когда вы устанавливаете положение слоя, вы устанавливаете положение центра слоя в системе координат его суперслойного слоя.
Поскольку положение относительно точки привязки слоя, изменение этой точки привязки при сохранении того же положения перемещает слой. Чтобы предотвратить это перемещение, нужно изменить положение слоя, чтобы учесть новую точку привязки. Одним из способов этого является захват границ слоя, умножение ширины и высоты границ на нормализованные значения старой и новой точки привязки, учет разницы между двумя точками привязки и применение этой разницы к положению слоя.
Возможно, вы даже сможете учесть вращение таким образом, используя CGPointApplyAffineTransform()
с CGAffineTransform вашего UIView.
Ключом к решению этой проблемы стало использование свойства кадра, которое, как ни странно, единственное, что меняется.
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.
.