将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);
}发布于 2013-02-08 02:02:21
您并没有将transform应用于任何东西。你在创造它,然后把它扔掉。在任何情况下,您都不能在drawRect:中添加子视图。drawRect:用于自定义绘制当前视图,而不是用于管理视图层次结构。按照这种方式,每次重新绘制主视图时都会添加一个新的NSImageView。
我建议回到Cocoa Drawing Guide来了解Cocoa绘图是如何工作的。
查看您的代码,我认为您根本不需要drawRect:。您只需要添加一个子视图,可能是在awakeFromNib或initWithFrame:中。我假设你想要旋转视图。要做到这一点,最简单的方法是给它一个支持层(setWantsLayer:),然后在层上设置affineTransform。
或者,在drawRect:中,您可以旋转上下文,只绘制图像本身(不使用NSImageView)。有关如何进行自定义绘图的详细信息,请参阅Cocoa drawing Guide。
https://stackoverflow.com/questions/14757015
复制相似问题