将 NSAffineTransform 应用于 NSView
Apply NSAffineTransform to NSView
我想对 NSView 子类做几个简单的转换,使其在 X 轴、Y 轴或两者上翻转。我是一位经验丰富的 iOS 开发人员,但我不知道如何在 macOS 中执行此操作。我已经创建了一个具有所需平移和比例的 NSAffineTransform,但无法确定如何将其实际应用到 NSView。我能找到的唯一接受任何类型变换的 属性 是 [[NSView layer] transform]
,但这需要 CATransform3D。
我取得的唯一成功是使用转换来翻转图像(如果是 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 的提示。
我想对 NSView 子类做几个简单的转换,使其在 X 轴、Y 轴或两者上翻转。我是一位经验丰富的 iOS 开发人员,但我不知道如何在 macOS 中执行此操作。我已经创建了一个具有所需平移和比例的 NSAffineTransform,但无法确定如何将其实际应用到 NSView。我能找到的唯一接受任何类型变换的 属性 是 [[NSView layer] transform]
,但这需要 CATransform3D。
我取得的唯一成功是使用转换来翻转图像(如果是 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 的提示。