首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用或不使用NSAffineTransform旋转NSImage

使用或不使用NSAffineTransform旋转NSImage
EN

Stack Overflow用户
提问于 2009-08-18 14:12:09
回答 3查看 4K关注 0票数 2

我在NSView的一个子类上绘制了一个NSImage。在前面的问题中,有人帮助我在左上角竖直地画出了它。现在,我希望能够旋转图像。我有一个按钮,它增加了一个旋转变量%4,然后我将它乘以-90,得到旋转角度。然后我使用NSAffineTransform旋转图像,并将其转换回屏幕上。然而,它似乎并不像我期望的那样工作。我有两个问题。

1)当我旋转时,图像中不在前一帧中的区域的部分可以正确绘制。然而,之前在那里的药水仍然是原始的图像。这意味着经过几次旋转后,原始直立图像有一个正方形,然后在旋转图像的下方或左侧有一个矩形。

2)当我调整窗口大小时,图像会按照原来的垂直方向(不应该是这样)重新绘制(应该如此)。

基本上,我得出的结论是NSAffineTransform并不像我想的那样工作。有没有其他方法可以旋转(和平移)图像?谢谢

大代码块:( "WORKS“和"end works”之间的代码只是绘制图像的工作代码。它来自于我之前的问题)。

删除了旧代码,用新代码替换了较低的代码

谢谢

编辑:更多的研究发现,我可以旋转视图,而不是做NSAffineTtransform。这似乎效果更好。然而,我不能让翻译工作得很好。下面的新代码(删除原始代码以节省空间)

代码语言:javascript
复制
- (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];    
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-19 14:15:57

好吧,对于历史,如果其他人有这个问题,这是我想出的答案:

帧旋转保留在drawRect中,其他所有内容都移动到rotate方法:

代码语言:javascript
复制
-(void)rotate
{
    float deltaX, deltaY, height, width;

    rotation = (rotation +1) % 4 ;

    deltaX = 0;
    deltaY = 0;

// translate to account for rotation

    height = [image size].height;
    width = [image size].width;

    switch (rotation)
    {
        case 0:
            NSLog(@"No rotation ");
            deltaY -= width;
        break;
        case 1: 
            deltaY -= height;
            break;
        case 2:
            deltaX += height-width;
            deltaY -= height ;  
            break;
        case 3:
            deltaX += height-width;
            deltaY -= width;
            break;
    }

    NSPoint orig;
    orig.x = deltaX;
    orig.y = deltaY;

    [self rotateByAngle: 90.0];
    [self translateOriginToPoint: orig];

    [self setNeedsDisplay:YES];
}
票数 2
EN

Stack Overflow用户

发布于 2009-08-18 17:29:43

我猜你想让图像围绕它的中心旋转。如果是这样,您需要将仿射变换的原点平移到图像的中心,然后旋转,然后再平移回来。现在,如果您保留了先前位置的工件,这可能是因为您没有使用正确的矩形调用-NSView setNeedsDisplayInRect:。请记住,您需要使图像以前的位置和新的位置都无效。

更新:我刚刚注意到你在drawRect:中改变了视图的框架。要改变框架已经太晚了。相反,在不更改视图边框的情况下,在正确的位置绘制图像。

票数 1
EN

Stack Overflow用户

发布于 2009-09-06 03:17:10

查看我的旧的转换后的图像示例代码:http://developer.apple.com/mac/library/samplecode/Transformed_Image/index.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1294148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档