Mesmo depois de aplicar tudo o que mencionei, ainda tive dramas com as imagens. No final, acabei de usar o Gimp para criar uma versão 'invertida vertical' de todas as minhas imagens. Agora não preciso usar nenhuma transformação. Espero que isso não cause mais problemas na pista.
Alguém sabe por que CGContextDrawImage estaria desenhando minha imagem de cabeça para baixo? Estou carregando uma imagem do meu aplicativo:
O Quartz2d usa um sistema de coordenadas diferente, onde a origem está no canto inferior esquerdo. Portanto, quando o Quartz desenha o pixel x [5], y [10] de uma imagem 100 * 100, esse pixel está sendo desenhado no canto inferior esquerdo em vez de no canto superior esquerdo. Assim, causando a imagem 'invertida'.
O sistema de coordenadas x corresponde, então você precisará inverter as coordenadas y.
CGContextTranslateCTM(context, 0, image.size.height);
Isso significa que traduzimos a imagem em 0 unidades no eixo x e na altura das imagens no eixo y. No entanto, isso por si só significará que nossa imagem ainda está de cabeça para baixo, apenas sendo desenhada "image.size.height" abaixo de onde desejamos que ela seja desenhada.
O guia de programação do Quartz2D recomenda o uso do ScaleCTM e a passagem de valores negativos para inverter a imagem. Você pode usar o seguinte código para fazer isso -
CGContextScaleCTM(context, 1.0, -1.0);
Combine os dois antes da sua CGContextDrawImage
ligação e você deverá ter a imagem desenhada corretamente.
UIImage *image = [UIImage imageNamed:@"testImage.png"];
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, imageRect, image.CGImage);
Apenas tome cuidado se as coordenadas do imageRect não corresponderem às da sua imagem, pois você pode obter resultados indesejados.
Para converter de volta as coordenadas:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);