Configurar o quadro correto de um CAShapeLayer recém-criado
Em resumo
Apple NÃO define oframe
oubounds
paraCAShapeLayer
automaticamente (e a Apple NÃO implementou um equivalente a[UIView sizeThatFits]
) Se você definir o quadro usando o tamanho da caixa delimitadora do caminho ... tudo dará errado. Não importa como você tente configurá-lo, ele estraga o caminhoEntão, qual é a maneira correta de definir programaticamente o quadro de umCAShapeLayer
com um @ adicionado recentemenCGPath
? Os documentos da Apple são omisso
Coisas que eu tentei, que não funcionam:
Criar umaCAShapeLayer
Criar umaCGPath
, adicione-o à camadaVerifique a camadaframe
- Está{{0,0},{0,0}}
Set:layer.frame = CGPathGetBoundingBox( layer.path )
@Frame agora está correto, mas o caminho agora está em DOUBLE offset - alterando oframe
faz com que o caminho seja efetivamente deslocado um @ ext(x,y)
píxei
Set:layer.bounds = CGPathGetBoundingBox( layer.path )
layer.position = CGPathGetBoundingBox( layer.path ).origin
... sem dados; ainda nozes.Uma coisa que tentei fazer isso funcionou, mas causa problemas em outros lugares:
EDIT: isso QUEBRA assim que você gira automaticamente a tela. Meu palpite: a rotação automática da Apple requer controle da propriedade "transformar"
Criar umaCAShapeLayer
Criar umaCGPath
, adicione-o à camadaVerifique o quadro da camada - é{{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
Isso funciona, mas ... muitos códigos de terceiros assumem que a transformação inicial de umCALayer
é identidade.
Não deve ser tão difícil! Certamente há algo que estou fazendo errado aqui?
(Tive uma sugestão: "toda vez que você adicionar um caminho, execute manualmente uma função personalizada para alterar todos os pontos por-1 * (top-left-point.x, top-left-point.y)
". Novamente, isso funciona - mas é ridiculamente complexo)