NSAffineTransformの有無にかかわらずNSImageではを回転させます
-
18-09-2019 - |
質問
私はNSViewのサブクラスの上に描かれているNSImageではを持っています。前の質問では、私は、左上隅に直立それを描画するために助けられました。今、私は、画像を回転させることができるようにしたいです。 Iは、回転変数%4をインクリメントボタンを持っており、私は回転角度を見つけるために-90ことによってこれを掛けます。私は、画像を回転させるNSAffineTransformを使用して、バックスクリーンにそれを翻訳します。しかし、それは私がそれが期待どおりに動作していないようです。私は2つの問題を抱えてます。
私が回転すると、1)、前のフレームでなかった領域にある画像の一部が正しく描画されます。しかし、以前に存在したポーションは、原画像として残ります。これは、数回転した後、元の直立画像と回転画像の左または下へ、次いで長方形の四角があることを意味します。
2)私が再サイズウィンドウ、元の直立姿勢における画像再描画(それが必要として)()はべきではありません。
基本的に、私はNSAffineTransformが、私はそれがないと思うように動作していないという結論に来ています。画像を回転(および変換)するためにいくつかの他の方法はありますか?感謝
大コードチャンク:。(。「WORKS」と「終了作品」とのコードだけで画像を描画するコードを働いているそれは私の前の質問から来た)
[OLD CODE DELETEDは、新しいコードと下部置換しました]
感謝
編集:もう少し研究が代わりに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];
}
解決
[OK]を、歴史のために、ケースには他の誰が、ここでこの質問を持っている私が作ってみた答えです。
ローテート方式にフレーム回転はの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];
}
他のヒント
私はあなたがそれの中心を中心画像を回転したいことを推測しています。もしそうなら、あなたは画像の中心にアフィン変換の起源を翻訳する必要があり、その後、戻って翻訳し、その後、回転させます。正しい長方形で:[NSViewのsetNeedsDisplayInRect] - あなたは&過去の位置のアーティファクトが余っている場合は、あなたが電話をしてくれなかったので、今、それはおそらくです。あなたがイメージの新旧両方の位置を無効にする必要があることを忘れないでください。
アップデート:私はちょうどあなたがのdrawRectの中から、ビューのフレームを変更していることに気づい:.これは、フレームを変更するには遅すぎます。代わりに、ビューのフレームを変更することなく、適切な位置に画像を描画します。