我在 NSView 的子类上绘制了一个 NSImage。在上一个问题中,有人帮我把它画在左上角。现在,我希望能够旋转图像。我有一个增加旋转变量 %4 的按钮,然后我将其乘以 -90 以找到旋转角度。然后我使用 NSAffineTransform 旋转图像,并将其转换回屏幕上。但是,它似乎并没有按照我期望的方式工作。我有两个问题。
1)当我旋转时,图像中不在前一帧的区域中的部分被正确绘制。然而,先前存在的药水仍然是原始图像。这意味着经过几次旋转后,原始直立图像有一个正方形,然后在旋转图像的下方或左侧有一个矩形。
2)当我重新调整窗口大小时,图像会以原始的直立方向(不应该)重新绘制(应该如此)。
基本上,我得出的结论是 NSAffineTransform 不像我认为的那样工作。还有其他方法可以旋转(和平移)图像吗?谢谢
大代码块:(“WORKS”和“end works”之间的代码是用于绘制图像的工作代码。它来自我之前的问题)。
[旧代码已删除,用新代码替换较低]
谢谢
编辑:多一点研究发现,我可以旋转视图,而不是做 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];
}