Como para lidar com uma tradução Matriz numa Y invertido ponto de vista eixo
-
03-07-2019 - |
Pergunta
Meu usercase é uma aplicação iphone onde eu faço uma animação na escala, rotação e translação de uma imagem.
Então, eu concat tudo e alimentá-lo para a propriedade transformar, mas há um problema:
Uma vez que minhas imagens variam em tamanho, é um problema para posicioná-los corretamente. Estou acostumado a um y invertido eixo sistema de coordenadas, então eu quero minha imagem para posicionadas exatamente a 60 pixels no eixo y.
Então, como posso mudar a partir do eixo y cartesiana original, para um ponto do eixo y invertido de vista?
Solução
Como smacl pontos fora, a maneira mais fácil de fazer isso é para mudar a sua origem ao da tela usando inferior esquerdo (screenheight - viewheight - y). Em vez de y nas origens de seus pontos de vista ??p>
No entanto, você pode virar o sistema de coordenadas de camadas a sua principal da vista usando um CATransform3D. Eu faço isso para que eu possa compartilhar o mesmo código de layout Core Animation CALayer entre minha aplicação do iPhone e um cliente Mac (o iPhone inverte o Quartz normal do sistema de coordenadas para CALayers para coincidir com as UIViews). Tudo que você precisa fazer para ativar esse é colocar a linha
self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);
em seu código de inicialização para o seu UIView de hospedagem camada. Lembre-se que isso vai virar suas CALayers, portanto, qualquer renderização de texto UIKit nessas camadas podem também precisa ser invertida utilizando o código semelhante ao seguinte:
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);
UIFont *theFont = [UIFont fontWithName:@"Helvetica" size:fontSize];
[text drawAtPoint:CGPointZero withFont:theFont];
CGContextRestoreGState(context);
Você pode fazer um tipo semelhante de inversão usando um CGAffineTransform, mas você também precisará aplicar uma tradução para fazer esse trabalho:
CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, self.frame.size.height);
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f);
Você pode ser capaz de usar a transformação afim de converter suas coordenadas origem, utilizando CGPointApplyAffineTransform ().
Outras dicas
Para cada ordenada y, y = top-y, onde superior é o y ordenada do topo da caixa delimitadora que você está desenhando em.