2012-08-31 13 views
10

Hice dos instancias de UILabel y las agregué a la vista ViewController. Y luego cambié el anchorPoint de cada uno de 0.5 a 1.0 (xey).¿Por qué mi vista se mueve cuando configuro su marco después de cambiar su anclaje?

A continuación, reinicié el marco de uiLabel2 en su marco Lo creé con: (100,100,100,20).

Cuando ejecuto la aplicación, uiLabel1 y uiLabel2 se muestran en diferentes posiciones. ¿Por qué?

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

Respuesta

37

A CALayer tiene cuatro propiedades que determinan donde aparece en su superlayer:

  • position (que es la misma que la propiedad de la vista center)
  • bounds (en realidad solo la parte size de bounds)
  • anchorPoint
  • transform

Notará que frame es no una de esas propiedades. La propiedad frame en realidad se deriva de esas propiedades. Cuando establece la propiedad frame, la capa realmente cambia su center y bounds.size según el marco que proporcione y el anchorPoint existente de la capa.

de crear la primera capa (mediante la creación de la primera UILabel, que es una subclase de UIView, y cada UIView tiene una capa), lo que le da un marco de 100,100,100,20. La capa tiene un punto de ancla predeterminado de 0.5,0.5. Entonces calcula sus límites como 0,0,100,20 y su posición como 150,110. Se ve así:

anchor at center

A continuación, cambiar su punto de anclaje a 1,1.Como no cambia directamente la posición o los límites de la capa, y no los cambia indirectamente al establecer su marco, la capa se mueve de modo que su nuevo punto de anclaje esté en su posición (sin modificar) en su supercapa:

anchor at corner

Si solicita el marco de la capa (o de la vista) ahora, obtendrá 50,90,100,20.

Cuando crea la segunda capa (para el segundo UILabel), después de cambiar su punto de anclaje, establece su marco. Así que la capa calcula una nueva posición y los límites basados ​​en el marco que proporciona y su punto de anclaje existente:

anchor at corner with reset frame

Si le preguntas a la capa (o vista) para su marco ahora, obtendrá el marco que conjunto, 100,100,100,20. Pero si solicita su posición (o el centro de la vista), obtendrá 200,120.

+0

¡Oh! Rob !. Gracias por su excelente y detallada respuesta. –

4

Bueno, eso es exactamente lo que hace un punto de anclaje. Antes de cambiar los puntos de anclaje, estaba configurando el marco en función del centro de la etiqueta. Después de eso, está configurando el marco basado en la esquina inferior derecha.

Como solo estaba restableciendo el marco para una sola etiqueta, una ajustó su marco en función del nuevo punto de anclaje y la otra se mantuvo en la posición anterior.

Si desea que estén en el mismo punto, debe restablecer el marco para ambos después de editar el punto de ancla, O no lo haga en absoluto.

This guide explica más sobre los puntos de anclaje.

+0

Su explicación y enlace han sido de gran ayuda para mí. –

+0

Gracias KDarker. –

+0

El enlace está roto :( – Nathaniel

Cuestiones relacionadas