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