2012-08-31 9 views
10

Zrobiłem dwie instancje UILabel i dodaje je przeglądać mój ViewController „s. A następnie zmieniłem anchorPoint każdego z 0,5 do 1,0 (x i y).Dlaczego mój widok porusza się po ustawieniu jego ramki po zmianie jej anchorPoint?

Następnie, zresetowałem ramkę uiLabel2 do jej ramki, którą utworzyłem z: (100,100,100,20).

Po uruchomieniu aplikacji uiLabel1 i uiLabel2 są wyświetlane w różnych pozycjach. Czemu?

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

Odpowiedz

37

CALayer ma cztery właściwości, które określają, gdzie pojawia się w jego superlayer:

  • position (który jest taki sam jak widok za center własności)
  • bounds (właściwie tylko size część bounds)
  • anchorPoint
  • transform

Zauważysz, że frame jest nie jedną z tych właściwości. Właściwość frame jest faktycznie wyprowadzana z tych właściwości. Kiedy ustawić właściwość frame warstwa faktycznie zmienia swoje center i bounds.size oparte na ramie, które udostępniasz i warstwę istniejącego anchorPoint.

utworzyć pierwszą warstwę (tworząc pierwszy UILabel, która jest podklasą UIView, a każdy UIView ma warstwę), nadając mu klatkę 100,100,100,20. Warstwa ma domyślny punkt kontrolny 0.5,0.5. Oblicza więc swoje granice jako 0,0,100,20, a jego pozycja jako 150,110. Wygląda to tak:

anchor at center

Następnie należy zmienić swój punkt zaczepienia do 1,1.Ponieważ nie zmieniasz bezpośrednio położenia ani granic warstwy i nie zmieniasz ich pośrednio, ustawiając jej ramkę, warstwa przesuwa się tak, że jej nowy punkt kontrolny znajduje się w jej (niezmienionej) pozycji w jej warstwie superlayera:

anchor at corner

Jeśli teraz poprosisz o ramkę warstwy (lub widoku), otrzymasz 50,90 100,20.

Po utworzeniu drugiej warstwy (dla drugiego UILabel), po zmianie punktu zakotwiczenia, ustawia się jej ramkę. Zatem warstwa oblicza nową pozycję i granic w oparciu o klatki świadczenia i jego istniejący punkt kontrolny:

anchor at corner with reset frame

Jeśli zapytać warstwę (lub widoku) na swojej ramie teraz, dostaniesz ramkę ty set, 100,100,100,20. Ale jeśli poprosisz o jego pozycję (lub centrum widoku), dostaniesz 200,120.

+0

Oh! Rob! Dziękuję za wspaniałą i szczegółową odpowiedź. –

4

Dobrze, że jest dokładnie to, co robi punkt kontrolny. Przed zmianą punktów kontrolnych ustawiasz ramkę w oparciu o środek etykiety. Następnie ustawiasz ramkę w prawym dolnym rogu.

Ponieważ były tylko resetowanie ramki na tylko jednej etykiety, jeden regulować jego rama oparta na nowym punkcie kontrolnym, a drugi przebywał w starym miejscu.

Jeśli chcesz, żeby być w tym samym miejscu, to trzeba zresetować ramki dla obu z nich po edycji punkt zaczepienia, czy nie punkt zaczepienia w ogóle.

This guide wyjaśnia więcej informacji na temat punktów kotwicznych.

+0

Twoje wyjaśnienie i podany link były dla mnie dobrą pomocą. –

+0

Dzięki KDarker. –

+0

Link jest uszkodzony :( – Nathaniel

Powiązane problemy