我正在瞭解CALayer
並存在以下問題。下面的兩張圖片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)使用
img.CGImageForProposedRect(&aView.frame, context: nil, hints: [NSImageHintInterpolation: 3])
和設置此作爲l
內容生成CGImage
,2)設定l.contentsScale=2
,3)設置l.edgeAntialiasingMask=[.LayerLeftEdge, .LayerRightEdge, .LayerBottomEdge, .LayerTopEdge]
,4)使aView
層支持的,通過移動aView.wantsLayer=true
之前aView.layer = l
。我不能做任何的工作......
這兩種觀點都是50×50,而圖像本身是我從本教程抓起
https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/
,這是一個253 X 254的PNG圖像在這個應用程序的資產。
我敢肯定,我失去了一些東西簡單在這裏...
感謝您的幫助!
UPDATE: 委派繪圖似乎工作:
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()
}
}
希望有一個更好的解決方案的東西,應該工作關中...
酷!這工作。我在擺弄AutoLayout並自動調整圖層大小,這似乎也適用於此。雖然,你對成本和文檔的評論讓我對它的使用感到有些緊張......出於好奇(如果你知道):這是Cocoa用於默認渲染NSImage的原因嗎?如果是這樣,爲什麼他們沒有將這個CALayer的默認值設置爲... – user3763801
這些都是在GPU上完成的,所以我不會過多擔心成本。 Afaik,你可以預期線性爲2倍,雙線性爲4倍,而三線性爲12倍不做任何插值的成本。不太清楚NSImage默認使用什麼,但我知道它們會爲不同的尺寸生成多個圖像表示。您可以檢查NSGraphicsContext上imageInterpolation的值以找出結果。 –