Frage

Ich habe ein NSImage bekam auf einer Unterklasse von NSView gezogen werden. In einer früheren Frage wurde ich geholfen, es zu zeichnen aufrecht in der oberen linken Ecke. Nun, ich mag das Bild drehen können. Ich habe eine Schaltfläche, die eine Drehgröße% 4, erhöht und dann die I multiplizieren mit -90 die Drehwinkel zu finden. Ich habe dann eine NSAffineTransform verwenden, um das Bild zu drehen, und übersetze sie zurück auf den Bildschirm. Allerdings scheint es nicht die Art und Weise zu arbeiten, ich es erwarte. Ich habe zwei Probleme.

1) Wenn ich drehe, der Teil des Bildes, das in einem Gebiet, das nicht in dem vorherigen Rahmen war wird korrekt gezeichnet. der Trank jedoch die zuvor gab es bleibt wie das Originalbild. Dies bedeutet, dass nach mehreren Drehungen gibt es ein Quadrat des ursprünglichen aufrechten Bildes und dann ein Rechteck unten oder links von Bild drehen.

2) Wenn ich die Größe neu das Fenster, das Bild neu gezeichnet (wie es sein soll) in der ursprünglichen aufrechten Ausrichtung (wie es sollte nicht).

Grundsätzlich bin ich zu dem Schluss kommen, dass NSAffineTransform nicht die Art und Weise funktioniert Ich glaube, es tut. Gibt es eine andere Art und Weise (und übersetzt), um das Bild zu drehen? Dank

großer Code Chunk. (. Code zwischen „Werk“ und „End-Werken“ Code funktioniert nur das Bild zieht Es kam aus meiner vorherigen Frage)

[ALTER CODE DELETED, ersetzt niedriger mit neuem Code]

Dank

EDIT: Ein wenig mehr Forschung findet, dass stattdessen eine NSAffineTtransform tun ich die Ansicht drehen kann. Das scheint besser zu funktionieren. Allerdings kann ich nicht bekommen die Übersetzung ganz richtig zu arbeiten. neuer Code (Original-Code gelöscht, um Platz zu sparen)

- (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];    
}
War es hilfreich?

Lösung

Ok, für Geschichte, falls jemand diese Frage hat hier ist die Antwort, die ich habe kommen mit:

Der Rahmen Rotation bleibt in der drawRect, alles andere bewegt sich zum drehen Methode:

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

Andere Tipps

Ich vermute, dass Sie das Bild drehen mögen, dass über seine Mitte. Wenn dem so ist man der Ursprung der affin zur Mitte des Bildes umwandeln übersetzen müssen, dann drehen, dann übersetzen zurück. Nun, wenn Sie Artefakte die previos Position übrig haben, ist es wahrscheinlich, weil Sie nicht angerufen haben - [NSView setNeedsDisplayInRect:] mit den richtigen Rechtecken. Denken Sie daran, dass Sie sowohl die Bilder bisherige und neue Positionen entkräften müssen.

Update: Ich habe gerade bemerkt, dass Sie die Ansicht des Rahmens von innen drawRect sind zu ändern :. Das ist zu spät, um den Rahmen zu ändern. Stattdessen zeichnet das Bild in der richtigen Position, ohne die Rahmen der Ansicht zu ändern.

Haben Sie einen Blick auf meine alten transformiertes Bild Beispielcode an: http : //developer.apple.com/mac/library/samplecode/Transformed_Image/index.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top