2016-09-17 16 views
0

我正在瞭解CALayer並存在以下問題。下面的兩張圖片CALayer中的圖像未正確縮小並具有抗鋸齒問題

enter image description here

其實在我的應用程序兩種觀點:左邊的一個是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() 
    } 

} 

希望有一個更好的解決方案的東西,應該工作關中...

回答

1

你會得到鋸齒瑕疵,如果你請勿使用正確的最小/最大濾波器。

由於您將較大的圖像放入較小的CALayer中,因此您希望使用線性,雙線性或三線性濾波(按成本遞增的順序)。

對於圖層,您可以使用設置MIN濾波器:

layer.minificationFilter = kCAFilterTrilinear; 
+0

酷!這工作。我在擺弄AutoLayout並自動調整圖層大小,這似乎也適用於此。雖然,你對成本和文檔的評論讓我對它的使用感到有些緊張......出於好奇(如果你知道):這是Cocoa用於默認渲染NSImage的原因嗎?如果是這樣,爲什麼他們沒有將這個CALayer的默認值設置爲... – user3763801

+0

這些都是在GPU上完成的,所以我不會過多擔心成本。 Afaik,你可以預期線性爲2倍,雙線性爲4倍,而三線性爲12倍不做任何插值的成本。不太清楚NSImage默認使用什麼,但我知道它們會爲不同的尺寸生成多個圖像表示。您可以檢查NSGraphicsContext上imageInterpolation的值以找出結果。 –