En resumen:ajuste de marco correcto de un recién creado CAShapeLayer
- de Apple no establece el
frame
obounds
para unCAShapeLayer
automáticamente (y Apple no ha implementado un equivalente de[UIView sizeThatFits]
) - Si se establece el marco usando el tamaño del cuadro delimitador de la ruta ... todo sale mal. No importa cómo se intenta establecer que, se atornilla en marcha la Ruta
Así que, ¿cuál es la forma correcta de establecer mediante programación el marco de un recién creado CAShapeLayer
con un recién añadido CGPath
? Los documentos de Apple no dicen nada al respecto.
cosas I han intentado, que no funcionan:
- Crear una
CAShapeLayer
- Crear una
CGPath
, añadirlo a la capa - de Check
frame
la capa - es{{0,0},{0,0}}
- Set:
layer.frame = CGPathGetBoundingBox(layer.path)
El marco ahora es correcto, pero la ruta ahora es DOBLE desplazamiento - cambiando el
frame
hace que el camino que se ha desplazado efectivamente un extra de(x,y)
píxelesSet:
layer.bounds = CGPathGetBoundingBox(layer.path)
- ... todo se vuelve loco. Nada tiene sentido más
- Intente solucionarlo haciendo
layer.position = CGPathGetBoundingBox(layer.path).origin
- ... no dice; todavía loco
Una cosa que he intentado que funcionaba, pero causa problemas en otra parte:
EDIT: Esto rompe tan pronto como se auto-rotación de la pantalla. Mi suposición: la auto-rotación de Apple requiere el control de la propiedad "transformar".
- Crear un
CAShapeLayer
- Crear una
CGPath
, añadirlo a la capa - Compruebe marco de la capa - es
{{0,0},{0,0}}
- Set:
layer.frame = CGPathGetBoundingBox(layer.path)
- Set:
layer.transform = CGAffineTransformMakeTranslation(CGPathGetBoundingBox(layer.path).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin
Este funciona, pero ... muchos códigos de terceros asumen que la transformación inicial f o CALayer
es Identidad.
¡No debería ser tan difícil! Seguramente hay algo que estoy haciendo mal aquí?
(He recibido una sugerencia: "cada vez que agrega una ruta, ejecute manualmente una función personalizada para cambiar todos los puntos por -1 * (top-left-point.x, top-left-point.y)
".De nuevo, eso funciona, pero es ridículamente complejo)
¿Alguna vez encontró una solución para esto? – jannej
Aún no. Actualmente estoy usando la solución de la pregunta en sí. Es lento y es un dolor de mantener. Creo que el problema es un error en el código de Apple, tal vez? – Adam
Una pequeña adición: finalmente descubrí que ".frame" no es compatible con Apple. Esto es extraño, porque se usa en todas partes, pero si profundizas lo suficiente en los documentos y/o en las listas de correo de Apple, descubres notas de los ingenieros de Apple que dicen que no está diseñado para funcionar y que no corregirán errores con él. Se espera/se requiere que use .bounds para TODO, y trate .frame como "readonly". Por lo tanto, es especialmente irónico que en este caso, el ajuste .frame "casi funciona", donde el establecimiento de .bounds "nunca funciona" :) – Adam