【问题标题】:Apply NSAffineTransform to NSView将 NSAffineTransform 应用到 NSView
【发布时间】:2019-02-03 09:21:59
【问题描述】:

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

我唯一的成功是使用转换来翻转图像,如果是 NSImageView,通过在新的空 NSImage 上调用 lockFocus,创建转换,然后在锁定图像内绘制未翻转的图像。然而,这远不能令人满意,因为它不处理任何子视图,并且可能比直接将转换应用于 NSView/NSImageView 成本更高。

【问题讨论】:

  • 使用NSGraphicsContext 可能会满足您的需要。
  • 谢谢你。这是否意味着在drawRect 中进行翻转,检查确定是否应翻转的属性,然后在这些属性发生更改时调用setNeedsDisplay

标签: macos cocoa affinetransform nsaffinetransform


【解决方案1】:

这是解决方案:

- (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 的提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多