Свойство center
представления является простым отражением свойства position
его заднего слоя. Удивительно, но это означает, что center
не обязательно должен быть в центре вашего view
. Где position
находится в его пределах, основано на anchorPoint
, который принимает значения где-то между (0,0) и (1,1). Думайте об этом как о нормализованном индикаторе того, находится ли position
в его пределах. Если вы измените либо anchorPoint
, либо position
, границы будут корректироваться, а не сдвигать позицию w.r.t к superlayer
/ superview
. Чтобы настроить position
так, чтобы рамка обзора не сместилась, можно манипулировать center
.
piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
Представьте себе оригинальную вещь, где O
является точкой соприкосновения,
+++++++++++
+ O + +++++++++++
+ X + --> + X +
+ + + +
+++++++++++ + +
+++++++++++
Теперь мы хотим, чтобы это X
было в точке, где пользователь коснулся. Мы делаем это, потому что все масштабирование и ротация выполняются на основе position
/ anchorPoint
. Чтобы вернуть рамку в исходное положение, мы устанавливаем "center"
вида в положение касания.
piece.center = locationInSuperview;
Таким образом, это отражается в представлении, перенастраивая свой кадр назад,
+++++++++++
+++++++++++ + X +
+ X + --> + +
+ + + +
+ + +++++++++++
+++++++++++
Теперь, когда пользователь вращается или масштабируется, это будет происходить так, как если бы ось находилась в точке касания, а не в истинном центре вида.
В вашем примере местоположение представления может в итоге стать средним, то есть (300, 300), что означает, что anchorPoint
будет (0,6, 0,6), и в ответ frame
будет двигаться вверх. Для перенастройки мы переместим центр в сенсорное положение, переместим frame
вниз.