Якорная точка в CALayer - PullRequest
       13

Якорная точка в CALayer

2 голосов
/ 17 июня 2011

Глядя на пример Touches из документации Apple, есть такой метод:

// scale and rotation transforms are applied relative to the layer's anchor point
// this method moves a gesture recognizer's view's anchor point between the user's fingers
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        UIView *piece = gestureRecognizer.view;
        CGPoint locationInView = [gestureRecognizer locationInView:piece];
        CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];

        piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
        piece.center = locationInSuperview;
    }
}

Первый вопрос, может кто-нибудь объяснить логику установки точки привязки в подвид, и изменение центра надтаблицы (например, почему это делается)?

Наконец, как работает математика для оператора anchorPoint? Если у вас есть вид с границами 500, 500 и, скажем, вы касаетесь 100, 100 одним пальцем, 500, 500 другим. В этом поле ваша нормальная точка привязки (250, 250). Теперь это ???? (понятия не имею)

Спасибо!

Ответы [ 2 ]

9 голосов
/ 17 июня 2011

Свойство 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 вниз.

0 голосов
/ 17 июня 2011

Первый вопрос, может кто-нибудь объяснить логика установки точки привязки в подпредставлении, и изменение центр супервизии (например, почему это сделано)?

Этот код не меняет центр суперпредставления. Он меняет центр представления распознавателя жестов на местоположение жеста (координаты, указанные в кадре суперпредставления). Это утверждение просто перемещает представление в его суперпредставлении, следуя местоположению жеста. Настройка center может рассматриваться как сокращенный способ настройки frame.

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

Наконец, как математика работает для заявление anchorPoint? Если у тебя есть вид, который имеет границы 500, 500, и сказать, что вы касаетесь в 100, 100 с одним палец, 500, 500 с другой. В эта коробка ваша нормальная точка привязки (250, 250). Теперь это ???? (не имеют ключ)

Ключевая концепция, которую следует отметить для свойства anchorPoint, заключается в том, что диапазон значений в точке объявляется как [0, 1], независимо от того, каков этот фактический размер слоя. Итак, если у вас есть вид с границами (500, 500) и вы дважды коснетесь (100, 100) и (500, 500), местоположение в представлении жеста в целом будет (300, 300), и точка привязки будет (300/500, 300/500) = (0,6, 0,6).

...