gpt4 book ai didi

objective-c - NSAffineTransforms 没有被使用?

转载 作者:行者123 更新时间:2023-12-03 17:27:15 25 4
gpt4 key购买 nike

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

由于我围绕左下角旋转,并且希望将图像锁定到左上角,因此我需要移动图像。当我旋转一次时,图像位于+-象限,因此我需要将其向上移动一个 View 高度,并向左移动一个 View 高度减去图像高度。等等

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

}

最佳答案

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

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

您报告的问题听起来像是您在更改转换后没有重新绘制整个 View 。您是否正在调用 -setNeedsDisplay: YES?

这个 View 是如何嵌入到窗口中的?它在 NSScrollView 内部吗?您是否确定 ScrollView 随窗口一起调整大小?

关于objective-c - NSAffineTransforms 没有被使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1100574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com