在OS X上忽略CALayer的magnificationFilter

时间:2016-04-08 15:55:59

标签: objective-c macos cocoa core-animation osx-elcapitan

我在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使用放大滤镜值?

1 个答案:

答案 0 :(得分:0)

这是OS X中的一个错误。核心动画工程师似乎正在调查它,但是从maxOS Sierra beta 5开始修复它