【问题标题】:NSImage rotationNSImage 旋转
【发布时间】:2009-06-30 18:50:41
【问题描述】:

我有一个窗口,里面有一个 NSView 的子类。在视图内部,我放置了一个 NSImage。

我希望能够将图像旋转 90 度,将图像的(新)左上角保持在视图的左上角。当然,我将不得不旋转图像,然后将其平移以将原点放回原处。

在 Carbon 中,我发现 CGContextRotateCTM 可以满足我的要求。但是,我在 ObjC 中找不到正确的调用。 setFrameCenterRotation 似乎没有做任何事情,而在 setFrameRotation 中,我似乎无法弄清楚原点在哪里,所以我可以适当地翻译。

它似乎在移动。当我调整窗口大小时,它会放置图像(或其中的一部分,我似乎也有一个奇怪的剪辑问题),当我滚动时,它会跳转到不同的(并不总是相同的)位置。

这对任何人都有意义吗?

谢谢

【问题讨论】:

    标签: objective-c cocoa nsimage


    【解决方案1】:

    我为我正在使用的应用程序和 Cocoa(我假设您的问题是指 Cocoa 而不是 ObjC)旋转屏幕上的文本,这样做的方法是使用 NSAffineTransform。

    这是一个可以帮助您入门的 sn-p

    double rotateDeg = 90;
    NSAffineTransform *rotate = [[NSAffineTransform alloc] init];
    NSGraphicsContext *context = [NSGraphicsContext currentContext];
    
    [context saveGraphicsState];
    [rotate rotateByDegrees:rotateDeg];
    [rotate concat];
    
        /* Your drawing code [NSImage drawAtPoint....]for the image goes here 
           Also, if you need to lock focus when drawing, do it here.       */
    
    [rotate release];
    [context restoreGraphicsState];
    

    这里的旋转数学可能有点棘手,因为上面所做的是旋转您正在绘制的坐标系。我的 90 度旋转是逆时针旋转。

    【讨论】:

    • 是的,我的意思是 Cocoa,谢谢 那么,我是否只需要执行上述操作,然后 [view setNeedsDisplay:YES]?我知道 setNeedsDisplay 使视图调用 drawRect:,它完成了绘图工作......因为当我这样做时似乎什么都没有发生。
    • 我在上面输入的代码 sn-p 实际上应该在你的 NSView 子类的 drawRect: 方法中。每次重绘视图时都需要运行 NSAffineTransform。
    • 实际上,锁定焦点必须在之前 [NSGraphicsContext currentContext]完成,因为它设置了当前上下文。
    • @NikolaiRuhe:我认为他的意思是将这段代码放在drawRect: 中,当前上下文已经设置为视图。
    • @PeterHosey 是的,但是代码中的注释建议在设置 CTM 后锁定焦点。我只是想明确一点,这是行不通的。
    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多