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?

Foi útil?

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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top