CALayer 中的图像未正确缩小并且存在抗锯齿问题

image in CALayer is not scaled down properly and has anti-aliasing issues

我正在学习 CALayer 并遇到以下问题。下面两张图

实际上在我的应用程序中有两个视图:左边的一个是 NSImageView,右边的一个是图层托管 NSView,其图像与内容相同。这是我用来设置的 ViewController 的代码:

import Cocoa

class ViewController: NSViewController {
  @IBOutlet weak var aView: NSView!
  @IBOutlet weak var anImage: NSImageView!

  override func viewDidLoad() {
      super.viewDidLoad()

      let img = NSImage(named: "emptyStar")!

      let l = CALayer()
      l.contents = img

      aView.layer = l
      aView.wantsLayer = true

      anImage.image = img
  }
}

为什么 CALayer 图像看起来很糟糕,我该如何解决这个问题(坚持使用 CALayer)?右图的放大图显示抗锯齿效果不佳。

我尝试过的是:1) 使用

生成 CGImage
   img.CGImageForProposedRect(&aView.frame, context: nil, hints: [NSImageHintInterpolation: 3])

并将其设置为 l 的内容,2) 设置 l.contentsScale=2,3) 设置 l.edgeAntialiasingMask=[.LayerLeftEdge, .LayerRightEdge, .LayerBottomEdge, .LayerTopEdge],4) 使 aView 层支持,通过移动 aView.wantsLayer=trueaView.layer = l 之前。我无法完成任何这些工作...

两个视图都是 50 x 50,而图像本身是我从本教程中抓取的 253 x 254 PNG 图像

https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/

它在这个应用程序的资产中。

我很确定我在这里遗漏了一些简单的东西...

感谢您的帮助!

更新: 委托绘图似乎可行:

class ViewController: NSViewController {
    @IBOutlet weak var aView: NSView!

    override func drawLayer(layer: CALayer, inContext ctx: CGContext) {
        NSGraphicsContext.setCurrentContext(NSGraphicsContext(CGContext: ctx, flipped: false))
        NSImage(named: "emptyStar")!.drawInRect(layer.bounds)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let l = CALayer()
        l.delegate = self

        aView.layer = l
        aView.wantsLayer = true

        aView.layer!.setNeedsDisplay()
   }

}

希望有更好的解决方案来解决应该开箱即用的问题...

如果您没有使用正确的 min/mag 过滤器,您将得到混叠伪像。

由于您要将较大的图像放入较小的 CALayer,因此您需要使用线性、双线性或三线性过滤(按成本递增的顺序)。

对于图层,您可以使用以下方法设置最小过滤器:

layer.minificationFilter = kCAFilterTrilinear;