Pergunta

Eu tenho um ser NSImage desenhado em uma subclasse de NSView. Em uma pergunta anterior, eu estava ajudou a desenhá-lo na posição vertical no canto superior esquerdo. Agora, eu quero ser capaz de girar a imagem. Eu tenho um botão que incrementos uma variável de rotação% 4, e então eu multiplicar isso por -90 para encontrar o ângulo de rotação. Eu, então, usar um NSAffineTransform para girar a imagem, e traduzi-lo de volta para a tela. No entanto, não parece estar funcionando da maneira que eu esperava que. Eu tenho dois problemas.

1) Quando rodar, a parte da imagem que está em uma área que não foi no quadro anterior fica desenhado correctamente. No entanto, a poção que era anteriormente não permanece como a imagem original. Isto significa que após várias rotações, há uma praça da imagem na vertical original e, em seguida, um retângulo abaixo ou à esquerda da imagem rotação.

2) Quando eu re-size da janela, as redraws imagem (como deveria) na orientação vertical original (como ele não deveria).

Basicamente, eu estou chegando à conclusão de que NSAffineTransform não funciona da maneira que eu acho que ele faz. Existe alguma outra forma de rotação (e traduzir) a imagem? graças

grande pedaço de código:. (. Código entre "obras" e "obras finais" está trabalhando código para apenas desenhar a imagem Ele veio da minha pergunta anterior)

[antigo Código excluído, substituído inferior com novo código]

graças

EDIT: um pouco mais achados de pesquisa que em vez de fazer uma NSAffineTtransform posso rodar a vista. Isso parece funcionar melhor. No entanto, não pode obter a tradução para o trabalho certo. novo código abaixo (código original excluída para economizar espaço)

- (void)drawRect:(NSRect)rect
{

//WORKS
    NSRect frame;
    frame.origin = NSZeroPoint;
    frame.size = [image size];
// end works

    float deltaX, deltaY, height, width;

// if the rotate button was just clicked, we need to rotate by 90 deg, otherwise not
    double rotateDeg = justRot ? -90.0 : 0;

    justRot = NO;

// rotate

    deltaX = 0;
    deltaY = 0;

// translate to account for rotation

    height = [image size].height;
    width = [image size].width;

    switch (rotation)
    {
        case 0:
            NSLog(@"No rotation ");
            break;
        case 1: 
            deltaX += width;
            break;
        case 2:
            deltaX += width;
            deltaY +=  height;  
            break;
        case 3:
            deltaY += height;
            break;
    }


    NSPoint orig;
    if (rotation != 0)
    {
        orig.x = -100;
        orig.y = -100;
    }
    [self rotateByAngle: rotateDeg];
    NSLog(@"orig %f %f", orig.x, orig.y);
//  WORKS
    [self setFrame: frame];
    [image drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
// end works
    [self translateOriginToPoint: orig];    
}
Foi útil?

Solução

Ok, para a história, no caso de alguém tem essa questão aqui é a resposta que eu vim acima com:

As estadias de rotação de quadros no drawRect, tudo o resto se move para o método de rotação:

-(void)rotate
{
    float deltaX, deltaY, height, width;

    rotation = (rotation +1) % 4 ;

    deltaX = 0;
    deltaY = 0;

// translate to account for rotation

    height = [image size].height;
    width = [image size].width;

    switch (rotation)
    {
        case 0:
            NSLog(@"No rotation ");
            deltaY -= width;
        break;
        case 1: 
            deltaY -= height;
            break;
        case 2:
            deltaX += height-width;
            deltaY -= height ;  
            break;
        case 3:
            deltaX += height-width;
            deltaY -= width;
            break;
    }

    NSPoint orig;
    orig.x = deltaX;
    orig.y = deltaY;

    [self rotateByAngle: 90.0];
    [self translateOriginToPoint: orig];

    [self setNeedsDisplay:YES];
}

Outras dicas

Eu estou supondo que você gostaria de rodar a imagem sobre ele do centro. Se assim você precisa traduzir a origem da transformação afim ao centro da imagem, em seguida, gire, então traduzir para trás. Agora, se você tem artefatos da posição previos que sobraram, provavelmente é porque você não ligou - [NSView setNeedsDisplayInRect:] com os retângulos corretas. Lembre-se que você precisa para invalidar ambas as imagens anteriores e novas posições.

Update: Eu notei que você está mudando quadro da visão de dentro drawRect :. Isso é tarde demais para mudar o quadro. Em vez disso, desenhar a imagem no local correto, sem alterar o quadro do ponto de vista.

Tenha um olhar em meu código de exemplo imagem transformada velho em: http : //developer.apple.com/mac/library/samplecode/Transformed_Image/index.html

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