macos - 将 NSAffineTransform 应用于 NSView

标签 macos cocoa affinetransform nsaffinetransform

我想对 NSView 子类进行一些简单的转换,以在 X 轴、Y 轴或两者上翻转它。我是一名经验丰富的 iOS 开发人员,但我就是不知道如何在 macOS 中做到这一点。我已经创建了一个具有所需翻译和比例的 NSAffineTransform,但无法确定如何将其实际应用到 NSView。我能找到的唯一接受任何类型变换的属性是 [[NSView layer] transform],但这需要 CATransform3D。

我取得的唯一成功是使用转换来翻转图像(如果是 NSImageView),通过在新的空 NSImage 上调用 lockFocus 来创建转换,然后在锁定图像内绘制未翻转的图像。然而,这远不能令人满意,因为它不处理任何 subview ,并且可能比直接将转换应用于 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 的提示。

关于macos - 将 NSAffineTransform 应用于 NSView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54501504/

相关文章:

cocoa - NSWindow,使用 Core Animation 时的奇怪角落

java - 在 Java 中实现透明性

Java - 旋转 Rectangle2D 并设置长度?

linux - bash 别名中允许使用哪些字符

macos - 如何使 IKImageBrowserView Quick Look 图标看起来像 Finder 图标?

objective-c - 使用 NSLayoutManager 停止文本换行

objective-c - 压缩在 ZLib 库中不起作用

java - (Java) 围绕中心旋转,同时保持方向和方向引用

php - 如何设置要使用的默认 php.ini,OSX Yosemite

Mac 上的 Python : Fink? MacPorts?内置?自制?二进制安装程序?