2012-08-31 7 views
10

Ho creato due istanze di UILabel e le ho aggiunte alla vista del mio ViewController. E poi ho cambiato il anchorPoint di ciascuno da 0,5 a 1,0 (xey).Perché la mia vista si sposta quando imposto la sua cornice dopo aver cambiato il suo anchorPoint?

Successivamente, ho reimpostato il frame di uiLabel2 sul frame che ho creato con: (100,100,100,20).

Quando eseguo l'app, uiLabel1 e uiLabel2 vengono visualizzati in posizioni diverse. Perché?

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

risposta

37

Un CALayer ha quattro proprietà che determinano dove appare nella sua superlayer:

  • position (che è la stessa come proprietà center della visualizzazione)
  • bounds (in realtà solo la size parte bounds)
  • anchorPoint
  • transform

Si noterà che frame è non una di queste proprietà. La proprietà frame deriva effettivamente da tali proprietà. Quando si imposta la proprietà frame, il livello cambia effettivamente i valori center e bounds.size in base al frame fornito e allo anchorPoint esistente del livello.

si crea il primo strato (creando il primo UILabel, che è una sottoclasse di UIView, e ogni UIView ha uno strato), dandogli una cornice di 100,100,100,20. Il livello ha un punto di ancoraggio predefinito di 0,5,0.5. Quindi calcola i suoi limiti come 0,0,100,20 e la sua posizione come 150,110. Ecco come si presenta:

anchor at center

quindi si modifica il suo punto di ancoraggio a 1,1.Poiché non modifichi direttamente la posizione o i limiti del livello e non li modifichi indirettamente impostando la sua cornice, il livello si sposta in modo che il nuovo punto di ancoraggio si trovi nella sua posizione (invariata) nel suo super strato:

anchor at corner

Se chiedete il fotogramma del livello (o della vista) ora, otterrete 50,90,100,20.

Quando si crea il secondo livello (per il secondo UILabel), dopo aver modificato il suo punto di ancoraggio, si imposta la sua cornice. Così lo strato calcola una nuova posizione e limiti sulla base del telaio che fornisci e il suo attuale punto di ancoraggio:

anchor at corner with reset frame

Se chiedete lo strato (o vista) per il suo telaio ora, si otterrà il fotogramma set, 100,100,100,20. Ma se chiedi la sua posizione (o il centro della vista), otterrai 200.120.

+0

Oh! Rob! Grazie per la tua ottima e dettagliata risposta. –

4

Beh, questo è esattamente ciò che fa un punto di ancoraggio. Prima di modificare i punti di ancoraggio, si stava impostando il frame in base al centro dell'etichetta. Dopodiché, stai impostando la cornice in base all'angolo in basso a destra.

Poiché era solo il ripristino del fotogramma per una sola etichetta, uno ha regolato la sua cornice in base al nuovo punto di ancoraggio e l'altro è rimasto nella posizione precedente.

Se si desidera che si trovino nello stesso punto, è necessario reimpostare il frame per entrambi dopo aver modificato il punto di ancoraggio, OPPURE non utilizzare il punto di ancoraggio.

This guide spiega di più sui punti di ancoraggio.

+0

Il tuo spiegamento e collegamento dato sono stati un buon aiuto per me. –

+0

Grazie KDarker. –

+0

Il collegamento è interrotto :( – Nathaniel

Problemi correlati