NSAffineTransform没有被使用?

时间:2009-07-08 21:14:48

标签: objective-c cocoa nsview nsaffinetransform

我有一个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];

}

1 个答案:

答案 0 :(得分:0)

为什么使用superview的大小?这是你几乎不需要担心的事情。您应该使视图独立工作,而不依赖于嵌入任何特定视图。

缩放imageRect的大小可能不是正确的方法。通常在调用-drawImage时,您希望源矩形成为图像的边界,并缩放目标矩形以缩放它。

您报告的问题类似于您在更改转换后没有重绘整个视图的声音。你在调用-setNeedsDisplay:是吗?

这个视图是如何嵌入窗口的?它在NSScrollView中吗?您是否确保滚动视图随窗口一起调整大小?