NSRect的子视图不受NSAffineTransform的影响

时间:2013-02-07 17:16:21

标签: objective-c cocoa

当应用NSAffineTransform旋转并转换为NSRect时,转换不会影响任何子视图。我已经包含了下面的代码。

- (void)drawRect:(NSRect)dirtyRect
    {

        NSAffineTransform * transform = [NSAffineTransform transform];
        [transform translateXBy:13.0 yBy:3.0];
        [transform rotateByDegrees:-45];
        [transform translateXBy:-13.0 yBy:3.0];
        [transform concat];


        NSImageView *imageViewWatchPointer;
        NSRect watchPointer = NSMakeRect(0, 0, 134, 49);
        imageViewWatchPointer = [[NSImageView alloc] initWithFrame:watchPointer];
        [imageViewWatchPointer setImageScaling:NSScaleNone];
        [imageViewWatchPointer setImage:[NSImage imageNamed:@"mastery_watch_pointer"]];
        [self addSubview:imageViewWatchPointer];

        [[NSColor blueColor] set];
        NSRectFill(watchPointer);  

    }

1 个答案:

答案 0 :(得分:3)

您没有将transform应用于任何事情。你正在创造它然后扔掉它。无论如何,您永远不会在drawRect:中添加子视图。 drawRect:用于自定义绘制当前视图,而不是用于管理视图层次结构。您完成此操作的方式,每次重绘主视图时都会添加一个新的NSImageView

我建议回到Cocoa Drawing Guide了解Cocoa绘图是如何工作的。

查看您的代码,我认为您根本不需要drawRect:。您只想在awakeFromNibinitWithFrame:中添加子视图。我假设你想要旋转视图。最简单的方法是给它一个支持层(setWantsLayer:),然后在图层上设置affineTransform

或者,在drawRect:中,您可以旋转上下文并只绘制图像(不使用NSImageView)。有关如何进行自定义绘图的详细信息,请参阅“可可绘图指南”。