Domanda

Ho un NSImage in corso di definizione in una sottoclasse di NSView. In una domanda precedente, sono stato aiutato a disegnare in posizione verticale in alto a sinistra. Ora, voglio essere in grado di ruotare l'immagine. Ho un pulsante che incrementa una variabile di rotazione% 4, e poi ho moltiplicare questo da -90 per trovare l'angolo di rotazione. Ho quindi utilizzare un NSAffineTransform per ruotare l'immagine, e tradurre di nuovo sullo schermo. Tuttavia, non sembra funzionare il modo in cui mi aspetto che. Ho due problemi.

1) Quando ruoto, la porzione dell'immagine che si trova in una zona che non ha partecipato al fotogramma precedente viene disegnato correttamente. Tuttavia, la pozione che in precedenza era lì rimane come l'immagine originale. Ciò significa che dopo diverse rotazioni, c'è un quadrato dell'immagine originale montante e quindi un rettangolo sotto oa sinistra dell'immagine ruotata.

2) Quando ho ri-dimensionare la finestra, i redraws immagine (come dovrebbe) in orientamento eretto originale (in quanto non dovrebbe).

In sostanza, sto arrivando alla conclusione che NSAffineTransform non funziona il mio modo di pensare lo fa. C'è qualche altro modo per ruotare (e tradurre) l'immagine? grazie

codice di grandi dimensioni pezzo:. (. Codice tra "opere" e "opere end" sta lavorando il codice per disegnare solo l'immagine E 'venuto dalla mia domanda precedente)

[VECCHIO CODICE CANCELLATO, sostituito inferiore con il nuovo codice]

grazie

EDIT: Un po 'più di ricerca rileva che invece di fare un NSAffineTtransform posso ruotare la vista. Questo sembra funzionare meglio. Tuttavia, non posso ottenere la traduzione di lavorare perfettamente ragione. nuovo codice qui sotto (codice originale cancellato per risparmiare spazio)

- (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];    
}
È stato utile?

Soluzione

Ok, per la storia, nel caso qualcuno altro ha questo problema ecco la risposta che mi è venuta in mente:

La rotazione telaio rimane nella drawRect, tutto il resto si sposta al metodo rotate:

-(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];
}

Altri suggerimenti

Sto indovinando che si desidera ruotare l'immagine su di esso è il centro. Se quindi è necessario tradurre l'origine della trasformazione affine al centro dell'immagine, quindi ruotare, quindi tradurre indietro. Ora, se avete artefatti della posizione previos sinistra sopra, probabilmente è perché non hai chiamato - [NSView setNeedsDisplayInRect:] con i rettangoli corretti. Ricordate che è necessario per invalidare le posizioni sia le immagini precedenti e nuovi.

Aggiornamento: Ho appena notato che stai cambiando la cornice della vista dal di dentro drawRect :. Che è troppo tardi per cambiare il telaio. Al contrario, disegnare l'immagine nella posizione corretta senza modificare cornice della vista.

Date un'occhiata al mio vecchio codice di esempio immagine trasformata in: http : //developer.apple.com/mac/library/samplecode/Transformed_Image/index.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top