CALayer 的 magnificationFilter 在 OS X 上被忽略

CALayer's magnificationFilter being ignored on OS X

我在 OS X 中有一个 CALayer,它的放大倍率和放大倍率过滤器设置如下所示,但无论层的大小如何,似乎都会使用放大倍率设置。

layer.magnificationFilter = kCAFilterNearest;
layer.minificationFilter = kCAFilterTrilinear;

三线性过滤在图层较小时起作用,但当放大时,图层是用看起来像线性的+最大mipmap级别绘制的,而不是最近的邻居。作为测试,我将放大过滤器设置为 kCAFilterNearest,这会导致它在所有比例级别上使用 kCAFilterNearest 进行渲染 - 因此无论绘制的图层大小如何,似乎都在使用 magnificationFilter。

我在 iOS 上尝试了相同的代码,它按预期工作,所以这一定是 OS X 渲染的一些怪癖。

完整代码:

@implementation MipView

- (instancetype)initWithCoder:(NSCoder *)coder {

    self = [super initWithCoder:coder];

    NSImage *image = [NSImage imageNamed:@"image"];

    CALayer *layer = [CALayer layer];
    layer.magnificationFilter = kCAFilterNearest;
    layer.minificationFilter = kCAFilterTrilinear;
    layer.frame = CGRectMake(0, 0, image.size.width, image.size.height);
    layer.contents = (__bridge id _Nullable)[image CGImageForProposedRect:NULL context:nil hints:nil];

    [self setLayer:[CALayer layer]];
    [self setWantsLayer:YES];
    [self.layer addSublayer:layer];

    return self;
}

- (IBAction)slider:(id)sender {
    self.layer.sublayerTransform = CATransform3DMakeScale([sender doubleValue], [sender doubleValue], 1);
}

@end

有没有办法让Core Animation在图层放大时使用放大滤镜值?

这是 OS X 中的一个错误。核心动画工程师似乎正在研究它,但从 maxOS Sierra beta 5

开始还没有修复它