我有一个NSView的子类,并且我正在绘制一个NSImage。我没有看到NSAffineTransforms旋转,翻译和缩放图像。
大部分工作正常。但是,有时,转换似乎没有被激活。
例如,当我调整窗口大小时,不会发生旋转变换。
当我放大图像时,它会将图像的左下角放在正确的位置,但不会对其进行缩放,但它会缩放图像中原始尺寸右侧的部分图片。如果我旋转它,它会正确缩放,但翻译错误。 (转换可能是我的计算错误)
以下是我的drawRect的代码:(对不起长代码块)
- (void)drawRect:(NSRect)rect
{
// Drawing code here.
double rotateDeg = -90* rotation;
NSAffineTransform *afTrans = [[NSAffineTransform alloc] init];
NSGraphicsContext *context = [NSGraphicsContext currentContext];
NSSize sz;
NSRect windowFrame = [[self window] frame];
float deltaX, deltaY;
NSSize superSize = [[self superview] frame].size;
float height, width, sHeight, sWidth;
NSRect imageRect;
if(image)
{
sz = [ image size];
imageRect.size = sz;
imageRect.origin = NSZeroPoint;
imageRect.size.width *= zoom;
imageRect.size.height *= zoom;
height = sz.height * zoom ;
width = sz.width *zoom ;
sHeight = superSize.height;
sWidth = superSize.width;
}
我需要尽早抓住所有尺寸,这样我以后可以在旋转时使用它们。我不确定我是否需要保护其中任何一项,但我从多年来的C ...中妄想...
[context saveGraphicsState];
// rotate
[afTrans rotateByDegrees:rotateDeg];
// translate to account for window size;
deltaX = 0;
deltaY = 0;
// translate to account for rotation
// in 1 and 3, X and Y are reversed because the entire FRAME
// (inculding axes) is rotated!
switch (rotation)
{
case 0:
// NSLog(@"No rotation ");
break;
case 1:
deltaY -= (sHeight - height);
deltaX -= sHeight ;
break;
case 2:
deltaX -= width;
deltaY -= ( 2*sHeight - height);
// it's rotating around the lower left of the FRAME, so,
// we need to move it up two frame hights, and then down
// the hieght of the image
break;
case 3:
deltaX += (sHeight - width);
deltaY -= sHeight;
break;
}
由于我在左下角旋转,我希望图像锁定在左上角,我需要移动图像。当我旋转一次时,图像位于+ - 象限,因此我需要将其向上移动一个视图高度,向左移动视图高度减去图像高度。等
[afTrans translateXBy:deltaX yBy:deltaY];
// for putting image in upper left
// zoom
[afTrans scaleBy: zoom];
printMatrix([afTrans transformStruct]);
NSLog(@"zoom %f", zoom);
[afTrans concat];
if(image)
{
NSRect drawingRect = imageRect;
NSRect frame = imageRect;
frame.size.height = MAX(superSize.height, imageRect.size.height) ;
[self setFrame:frame];
deltaY = superSize.height - imageRect.size.height;
drawingRect.origin.y += deltaY;
这使得框架的大小正确,因此图像位于框架的左上角。 如果图像大于窗口,我希望框架足够大,以便显示滚动条。如果不是,我希望框架足够大,以至于它到达窗口的顶部。
[image drawInRect:drawingRect
fromRect:imageRect
operation:NSCompositeSourceOver
fraction:1];
if((rotation %2) )
{
float tmp;
tmp = drawingRect.size.width;
drawingRect.size.width = drawingRect.size.height;
drawingRect.size.height = tmp;
}
这段代码可能完全是历史性的,现在我看一下......如果我旋转90或270度,我的想法就是交换高度和宽度。
}
else
NSLog(@"no image");
[afTrans release];
[context restoreGraphicsState];
}
答案 0 :(得分:0)
为什么使用superview的大小?这是你几乎不需要担心的事情。您应该使视图独立工作,而不依赖于嵌入任何特定视图。
缩放imageRect的大小可能不是正确的方法。通常在调用-drawImage时,您希望源矩形成为图像的边界,并缩放目标矩形以缩放它。
您报告的问题类似于您在更改转换后没有重绘整个视图的声音。你在调用-setNeedsDisplay:是吗?
这个视图是如何嵌入窗口的?它在NSScrollView中吗?您是否确保滚动视图随窗口一起调整大小?