Подтвердить что ты не робот

Почему мой взгляд перемещается, когда я устанавливаю его фрейм после изменения его anchorPoint?

Я сделал два экземпляра UILabel и добавил их в мой ViewController. И затем я изменил anchorPoint каждого с 0.5 на 1.0 (x и y).

Затем я reset кадр uiLabel2 к его кадру я создал его с помощью: (100,100,100,20).

Когда я запускаю приложение, uiLabel1 и uiLabel2 отображаются в разных положениях. Почему?

UILabel *uiLabel1 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease];
uiLabel1.text = @"UILabel1";
uiLabel1.layer.anchorPoint = CGPointMake(1, 1);

UILabel *uiLabel2 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease];
uiLabel2.text = @"UILabel2";
uiLabel2.layer.anchorPoint = CGPointMake(1, 1);
uiLabel2.frame = CGRectMake(100, 100, 100, 20);

[self.view addSubview:uiLabel1];
[self.view addSubview:uiLabel2];

enter image description here

4b9b3361

Ответ 1

A CALayer имеет четыре свойства, которые определяют, где он появляется в его суперслое:

  • position (что аналогично свойству view center)
  • bounds (фактически только часть size bounds)
  • anchorPoint
  • transform

Вы заметите, что frame - это не одно из этих свойств. Свойство frame фактически выведено из этих свойств. Когда вы устанавливаете свойство frame, слой фактически меняет свои center и bounds.size на основе предоставленного фрейма и существующего слоя anchorPoint.

Вы создаете первый слой (создавая первый UILabel, который является подклассом UIView, и каждый UIView имеет слой), предоставляя ему фрейм 100 100 100.20. У слоя есть опорная точка по умолчанию 0,5,0,5. Таким образом, он вычисляет свои оценки как 0,0100,20, а его положение - 150,110. Это выглядит так:

anchor at center

Затем вы меняете свою опорную точку на 1,1. Поскольку вы не изменяете позицию или границы слоя напрямую, и вы не меняете их косвенно, устанавливая его фрейм, слой перемещается так, что его новая опорная точка находится в своей (неизменной) позиции в своем суперслое:

anchor at corner

Если вы попросите фрейм слоя (или представления) сейчас, вы получите 50,90,100,20.

При создании второго слоя (для второго UILabel), после изменения точки привязки, вы установите его рамку. Таким образом, слой вычисляет новую позицию и границы на основе предоставленного фрейма и существующей точки привязки:

anchor at corner with reset frame

Если вы спросите слой (или представление) для своего кадра сейчас, вы получите установленный фрейм 100 100 100,20. Но если вы спросите его позицию (или центр обзора), вы получите 200 120.

Ответ 2

Ну, это именно то, что делает опорная точка. Перед изменением опорных точек вы устанавливаете рамку на основе центра этикетки. После этого вы устанавливаете рамку на основании нижнего нижнего угла.

Так как вы только сбросить кадр только для одной этикетки, один регулировать его рама на основе новой опорной точки, а другой остался в старой позиции.

Если вы хотите, чтобы они были в той же точке, то вам нужно reset рамка для обоих из них после редактирования точки привязки, или не узловую точку на всех.

Это руководство объясняет больше о якорных точках.