Quiero alterar el anchorPoint
, pero mantener la vista en el mismo lugar. He intentado NSLog
-ing self.layer.position
y self.center
ambos permanecen igual independientemente de los cambios en el AnchorPoint. ¡Sin embargo, mi vista se mueve!
¿Algunos consejos de como hacer esto?
self.layer.anchorPoint = CGPointMake(0.5, 0.5);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
self.layer.anchorPoint = CGPointMake(1, 1);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
El resultado es:
2009-12-27 20:43:24.161 Type[11289:207] center point: 272.500000 242.500000
2009-12-27 20:43:24.162 Type[11289:207] center point: 272.500000 242.500000
fuente
anchorPoint
yposition
están relacionados entre sí?Yo tuve el mismo problema. La solución de Brad Larson funcionó de maravilla incluso cuando se gira la vista. Aquí está su solución traducida en código.
Y el equivalente rápido:
fuente
La clave para resolver esto fue usar la propiedad frame, que es extrañamente lo único que cambia.
Swift 2
Swift 3
Luego hago el cambio de tamaño, donde se escala desde el punto de anclaje. Luego tengo que restaurar el viejo punto de anclaje;
Swift 2
Swift 3
EDITAR: esto se descarta si la vista se gira, ya que la propiedad del marco no está definida si se ha aplicado una CGAffineTransform.
fuente
Para mi comprension
position
yanchorPoint
fue más fácil cuando comencé a compararlo con mi comprensión de frame.origin en UIView. Una UIView con frame.origin = (20,30) significa que la UIView está a 20 puntos desde la izquierda y 30 puntos desde la parte superior de su vista principal. ¿Desde qué punto de una UIView se calcula esta distancia? Se calcula desde la esquina superior izquierda de una UIView.En capa
anchorPoint
marca el punto (en forma normalizada, es decir, 0 a 1) desde donde se calcula esta distancia, por ejemplo, layer.position = (20, 30) significa que la capaanchorPoint
está a 20 puntos desde la izquierda y 30 puntos desde la parte superior de su capa principal. Por defecto, un punto de anclaje de capa es (0.5, 0.5) por lo que el punto de cálculo de distancia está justo en el centro de la capa. La siguiente figura ayudará a aclarar mi punto:anchorPoint
También resulta ser el punto alrededor del cual ocurrirá la rotación en caso de que aplique una transformación a la capa.fuente
Hay una solución tan simple. Esto se basa en la respuesta de Kenny. Pero en lugar de aplicar el marco anterior, use su origen y el nuevo para calcular la traducción, luego aplique esa traducción al centro. ¡Funciona con vista girada también! Aquí está el código, mucho más simple que otras soluciones:
fuente
Para aquellos que lo necesitan, aquí está la solución de Magnus en Swift:
fuente
view.setTranslatesAutoresizingMaskIntoConstraints(true)
. gracias hombreview.setTranslatesAutoresizingMaskIntoConstraints(true)
es necesario cuando se usan restricciones de diseño automático.translatesAutoresizingMaskIntoConstraints
es justo lo que me faltaba, podría haber aprendido ahoraAquí está la respuesta del usuario945711 ajustada para NSView en OS X. Además de que NSView no tiene una
.center
propiedad, el marco de NSView no cambia (probablemente porque los NSView no vienen con un CALayer por defecto) pero el origen del marco de CALayer cambia cuando se cambia el anchorPoint.fuente
Si cambia anchorPoint, su posición también cambiará, A MENOS QUE su origen sea punto cero
CGPointZero
.fuente
Edite y vea el punto de anclaje de UIView a la derecha en Storyboard (Swift 3)
Esta es una solución alternativa que le permite cambiar el punto de anclaje a través del Inspector de atributos y tiene otra propiedad para ver el punto de anclaje para su confirmación.
Crea un nuevo archivo para incluir en tu proyecto
Agregar vista al guión gráfico y establecer la clase personalizada
Ahora establezca el Nuevo Punto de Anclaje para la UIView
Al activar Mostrar punto de anclaje se mostrará un punto rojo para que pueda ver mejor dónde estará visualmente el punto de anclaje. Siempre puedes apagarlo más tarde.
Esto realmente me ayudó a la hora de planificar transformaciones en UIViews.
fuente
Para Swift 3:
fuente
Ampliando la excelente y exhaustiva respuesta de Magnus, he creado una versión que funciona en subcapas:
fuente