- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我对在 Cocoa 中绘图还很陌生,并且正在开发一个涉及六边形网格的实验性应用程序。为了简化这个过程,我想倾斜坐标系,使 Y 轴向左旋转 30 度。我在Apple的Cocoa Drawing Guid
我想使用 NSAffineTransform 但没有收到警报: "Unknown type name 'NSAffineTransform' did you mean 'CGAffineTransfo
我有一个 NSView 的子类,我正在其中绘制一个 NSImage。我取消 NSAffineTransforms 来旋转、平移和缩放图像。 大部分工作正常。然而,有时,转换似乎没有被激活。 例如,当我
有人有任何好的例子来解释 NSAffinetransform 和 CGAffinetransform 之间的区别吗?谢谢 最佳答案 简单答案:NSAffinetransform 适用于 Mac osx
我想对 NSView 子类进行一些简单的转换,以在 X 轴、Y 轴或两者上翻转它。我是一名经验丰富的 iOS 开发人员,但我就是不知道如何在 macOS 中做到这一点。我已经创建了一个具有所需翻译和比
我正在尝试将 iOS 代码转换为 OSX 代码,但在图形移植方面遇到了一些困难。 在 iOS 下我有这个: NSRect rect = NSMakeRect(centerX.doubleValue -
我使用[NSGraphicsContext currentContext]获取上下文,如何获取当前应用于它的NSAffineTransform? 我需要这个来实现我自己的转换堆栈,我可以在其中执行 p
我在 NSView 的子类上绘制了一个 NSImage。在上一个问题中,我被帮助将它画在左上角。现在,我希望能够旋转图像。我有一个按钮可以增加旋转变量 %4,然后将其乘以 -90 来找到旋转角度。
这是一个相当简单的问题,我确信它并不难,但问题是...... 我有一个居中的 NSpanel,然后在居中之后我需要进行变换以在 Y 坐标上向下移动窗口,同时保持居中的 X 坐标。 NSAffineTr
当应用 NSAffineTransform 旋转和平移到 NSRect 时,所有 subview 都不会受到变换的影响。我已经包含了下面的代码。 - (void)drawRect:(NSRect)di
我是一名优秀的程序员,十分优秀!