我正在了解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)通过移动{{1}使aView
层支持在aView.wantsLayer=true
之前。我不能做任何这些工作......
两个视图都是50 x 50,而图像本身是我从本教程中获取的253 x 254 PNG图像
https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/
它位于此应用的资产中。
我很确定我在这里错过了一些简单的东西......
感谢您的帮助!
更新: 委托图纸似乎有效:
aView.layer = l
希望有一个更好的解决方案可以解决这个问题......
答案 0 :(得分:3)
如果您没有使用正确的min / mag过滤器,您将会出现锯齿现象。
由于您要将较大的图像放入较小的CALayer中,因此您需要使用线性,双线性或三线性过滤(按成本递增顺序)。
对于图层,您可以使用以下方式设置最小过滤器:
layer.minificationFilter = kCAFilterTrilinear;