1

当应用 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);  

    }
4

1 回答 1

3

你没有申请transform任何东西。您正在创建它,然后将其丢弃。无论如何,您永远不会在drawRect:. drawRect:用于自定义绘制当前视图,而不是用于管理视图层次结构。这样做的方式是,NSImageView每次重绘主视图时都会添加一个新视图。

我建议回到Cocoa 绘图指南以了解 Cocoa 绘图的工作原理。

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

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

于 2013-02-07T18:02:20.957 回答