2

NSViewのサブクラスにNSImageが描画されています。前の質問で、私はそれを左上隅に直立させるのを手伝ってくれました。ここで、画像を回転できるようにしたいと思います。回転変数%4をインクリメントするボタンがあり、これに-90を掛けて回転角を求めます。次に、NSAffineTransformを使用して画像を回転し、画面に変換し直します。ただし、期待どおりに機能していないようです。私には2つの問題があります。

1)回転すると、前のフレームになかった領域にある画像の部分が正しく描画されます。ただし、以前そこにあったポーションは元の画像のままです。これは、数回転した後、元の直立した画像の正方形があり、次に回転画像の下または左に長方形があることを意味します。

2)ウィンドウのサイズを変更すると、画像は元の直立した向きで(本来あるべきように)再描画されます。

基本的に、NSAffineTransformは私が思っているようには機能しないという結論に達しました。画像を回転(および平行移動)する他の方法はありますか?ありがとう

大きなコードチャンク:(「WORKS」と「endworks」の間のコードは、画像を描画するための作業コードです。これは私の前の質問からのものです)。

[古いコードが削除され、下のコードが新しいコードに置き換えられました]

ありがとう

編集:もう少し調査すると、NSAffineTtransformを実行する代わりに、ビューを回転できることがわかりました。これはうまくいくようです。ただし、翻訳を正しく機能させることができません。以下の新しいコード(スペースを節約するために元のコードが削除されました)

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

3 に答える 3

2

わかりました、歴史のために、他の誰かがこの質問を持っている場合に備えて、私が思いついた答えは次のとおりです:

フレームの回転は drawRect にとどまり、それ以外はすべて回転メソッドに移動します。

-(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];
}
于 2009-08-19T14:15:57.357 に答える
1

画像を中心に回転させたいと思います。その場合は、アフィン変換の原点を画像の中心に移動し、回転してから元に戻す必要があります。前の位置のアーティファクトが残っている場合は、おそらく正しい長方形で -[NSView setNeedsDisplayInRect:] を呼び出さなかったことが原因です。画像の以前の位置と新しい位置の両方を無効にする必要があることに注意してください。

更新: drawRect: 内からビューのフレームを変更していることに気付きました。フレームを変更するには遅すぎます。代わりに、ビューのフレームを変更せずに正しい位置に画像を描画してください。

于 2009-08-18T17:29:43.270 に答える
1

http://developer.apple.com/mac/library/samplecode/Transformed_Image/index.htmlで私の古い変換されたイメージのサンプル コードを見てください。

于 2009-09-06T03:17:09.837 に答える