我有被画在一个NSView的一个子类的NSImage中。在先前的问题,我是帮助绘制直立在左上角。现在,我希望能够旋转图像。我有一个按钮,增加一个旋转变量%4,然后我乘这个-90找到的旋转角度。然后我用一个NSAffineTransform旋转图像,并将其翻译回来到屏幕上。然而,这似乎并没有工作我希望它的方式。我有两个问题。

1)当我旋转,也就是在没有在先前帧中的区域的图像的部分被正确地绘制。然而,那是以前药水仍然存在的原始图像。这意味着,在几次旋转,有原始直立图像的平方和然后矩形下方或旋转图像的左侧。

2)当我重新大小的窗口,在原直立取向的图像重绘(如它应该)(如它应该不)。

基本上,我来给NSAffineTransform不工作,我认为它的方式结束。有一些其他的方式来转动(和平移)的形象呢?感谢

大的代码块:(“作品”和“结束工程”之间的代码是工作代码只是绘制图像它来自我的前面的问题)

[OLD CODE DELETED,更换新代码下]

感谢

编辑:多一点的研究发现,而不是做一个NSAffineTtransform我可以旋转视图。这似乎更好地工作。但是,我不能让翻译工作完全正确。下面新的代码(原代码删除,以节省空间)

- (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];    
}
有帮助吗?

解决方案

好了,对于历史,如果任何人有这个问题的答案在这里我想出来的:

在框架旋转停留在drawRect中,其他一切移动到旋转方法:

-(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];
}

其他提示

我猜你会喜欢它的中心旋转图像。如果是这样,你需要翻译的仿射转换的原点到图像的中心,然后旋转,再翻译回。现在,如果你有遗留previos位置的文物,这可能是因为你没叫 - [的NSView setNeedsDisplayInRect:]用正确的矩形。请记住,你需要同时失效以前的图像和新的位置。

更新:我只注意到你从内部的drawRect改变视图的框架:。这是为时已晚改变框架。取而代之的是,绘制在正确的位置的图像,而不改变视图的框架。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top