Configurando el marco correcto de un CAShapeLayer recién creado

En breve

Apple NO establece laframe obounds paraCAShapeLayer automáticamente (y Apple NO HA implementado un equivalente de[UIView sizeThatFits]) Si configura el marco utilizando el tamaño del cuadro delimitador de la ruta ... todo sale mal. No importa cómo intentes configurarlo, arruina el camino

Entonces, ¿cuál es la forma correcta de establecer mediante programación el marco de un @ recién creaCAShapeLayer con un @ agregado recientemenCGPath? Los documentos de Apple no dicen nada al respecto.

Cosas que he probado, que no funcionan:

Crear unCAShapeLayerCrear unCGPath, agréguelo a la capaCompruebe el @ de la caframe - es{{0,0},{0,0}}Set:layer.frame = CGPathGetBoundingBox( layer.path )

Frame ahora es correcto, pero la ruta ahora es DOBLE desplazamiento - cambiando laframe hace que el camino se desplace efectivamente un @ ext(x,y) píxeles

Set:layer.bounds = CGPathGetBoundingBox( layer.path )

... todo se vuelve loco. Ya nada tiene sentido Intenta arreglarlo haciendolayer.position = CGPathGetBoundingBox( layer.path ).origin...no dados; todavía loco.

Una cosa que intenté fue que funcionó, pero causa problemas en otros lugares:

EDIT: esto se rompe tan pronto como giras automáticamente la pantalla. Mi suposición: la rotación automática de Apple requiere control de la propiedad "transform".

Crear unCAShapeLayerCrear unCGPath, agréguelo a la capaCompruebe el 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

Esto funciona, pero ... un montón de código de terceros supone que la transformación inicial para unCALayer es Identidad.

No debería ser tan difícil! ¿Seguramente hay algo que estoy haciendo mal aquí?

(He tenido una sugerencia: "cada vez que agregue 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)