Macos 将NSAffiNetTransform应用于NSView
我想在NSView子类上做几个简单的转换,在X轴、Y轴或两者上翻转它。我是一名经验丰富的iOS开发人员,但我就是不知道如何在macOS中做到这一点。我已经创建了一个NSAffinetTransform,具有所需的翻译和比例,但无法确定如何将其实际应用于NSView。我能找到的唯一可以接受任何类型转换的属性是Macos 将NSAffiNetTransform应用于NSView,macos,cocoa,affinetransform,nsaffinetransform,Macos,Cocoa,Affinetransform,Nsaffinetransform,我想在NSView子类上做几个简单的转换,在X轴、Y轴或两者上翻转它。我是一名经验丰富的iOS开发人员,但我就是不知道如何在macOS中做到这一点。我已经创建了一个NSAffinetTransform,具有所需的翻译和比例,但无法确定如何将其实际应用于NSView。我能找到的唯一可以接受任何类型转换的属性是[[NSView layer]transform],但这需要一个CATTransformM3D 我所取得的唯一成功是使用变换在NSImageView中翻转图像,方法是对新的空的NSImage调
[[NSView layer]transform]
,但这需要一个CATTransformM3D
我所取得的唯一成功是使用变换在NSImageView中翻转图像,方法是对新的空的NSImage
调用lockFocus
,创建变换,然后在锁定的图像中绘制未折叠的图像。但是,这远远不能令人满意,因为它不处理任何子视图,并且可能比直接将转换应用于NSView
/NSImageView
成本更高。这就是解决方案:
- (void)setXScaleFactor:(CGFloat)xScaleFactor {
_xScaleFactor = xScaleFactor;
[self setNeedsDisplay];
}
- (void)setYScaleFactor:(CGFloat)yScaleFactor {
_yScaleFactor = yScaleFactor;
[self setNeedsDisplay];
}
- (void)drawRect:(NSRect)dirtyRect {
NSAffineTransform *transform = [[NSAffineTransform alloc] init];
[transform scaleXBy:self.xScaleFactor yBy:self.yScaleFactor];
[transform set];
[super drawRect:dirtyRect];
}
感谢l'l'l提供有关使用NSGraphicsContext的提示。使用可能会满足您的需要。谢谢l'l'l。这是否意味着在
drawRect
中进行翻转,检查确定是否应该翻转的属性,然后在更改这些属性时调用setNeedsDisplay
?