2015-05-04 20 views
0

我很想念這裏的東西。我得到Liveness在Interface Builder中工作。我可以用NSImage.draw直接在NSView中繪製圖像。所以圖像加載正確。但是,當我將它放入CALayer中時,它不會顯示出來。 我錯過了關於NSView行爲的一些信息嗎? CALayer的?層託管?或者是其他東西?在CALayer和生活中的NSImage

這裏的視圖的代碼:

import Foundation 
import AppKit 
import QuartzCore 

@IBDesignable public class CircularImageView: NSView { 
    var imageLayer: CALayer? 

    @IBInspectable public var edgeInset: CGFloat = 10 

    public var image: NSImage? { 
     didSet { 
      if let newImage = image { 
       imageLayer?.contents = newImage 
      } 
     } 
    } 

    // MARK: New in this class 

    private func prepareLayer() { 
     self.layer = CALayer() 
     self.wantsLayer = true 
    } 

    private func drawImage() { 
     // What am I doing wrong here? 
     var newImageLayer = CALayer() 
     newImageLayer.contentsGravity = kCAGravityResizeAspect 
     if let imageToSet = image { 
      newImageLayer.contents = imageToSet 
     } 
     let insetBounds = CGRectInset(self.bounds, edgeInset, edgeInset) 
     newImageLayer.frame = insetBounds 
     newImageLayer.backgroundColor = NSColor(calibratedWhite: 0.8, alpha: 1).CGColor 
     self.layer!.addSublayer(newImageLayer) 
     imageLayer = newImageLayer 
    } 

    private func test(){ 
     image?.drawInRect(self.bounds) 
    } 

    // MARK: NSView stuff 

    public override init(frame frameRect: NSRect) { 
     super.init(frame: frameRect) 
     prepareLayer() 
    } 

    public required init?(coder: NSCoder) { 
     super.init(coder: coder) 
     prepareLayer() 
    } 

    public override func viewWillDraw() { 
     super.viewWillDraw() 

     drawImage() 
    } 

    public override func prepareForInterfaceBuilder() { 
     super.prepareForInterfaceBuilder() 
     // Load default test image. 
     println("\(self): prepareForInterfaceBuilder") 
     let processInfo = NSProcessInfo.processInfo() 
     let environment = processInfo.environment 
     let projectSourceDirectories : AnyObject = environment["IB_PROJECT_SOURCE_DIRECTORIES"]! 
     let directories = projectSourceDirectories.componentsSeparatedByString(":") 

     if directories.count != 0 { 
      let firstPath = directories[0] as! String 
      let imagePath = firstPath.stringByAppendingPathComponent("CircularView/Bz1dSvR.jpg") 

      let image = NSImage(contentsOfFile: imagePath) 
      image!.setName("Test Image") 
      self.image = image 
     } 
    } 
} 

在此先感謝。

+0

你可以解釋一下這行:'let myLayer = CALayer()'?您正在創建一個CALayer,然後立即將其扔掉。 – matt

+0

這應該是self.layer = CALayer()謝謝,但仍然沒有工作。 –

+0

好的,但編輯來修復問題中的代碼。不要顯示不好的代碼,並期望人們閱讀你的想法。 – matt

回答

0

好的,我找到了答案。 我在這段代碼中犯了兩件錯誤的事。我正在研究圖層託管視圖,並且我只需要圖層支持的視圖。我沒有新的東西有區別。在向CALayer的內容添加NSImage之前,我需要使用lockFocus()和unlockFocus()來支持它。

下面是解決問題的完整代碼。

import Foundation 
import AppKit 

@IBDesignable public class CircularImageView: NSView { 
    var imageLayer: CALayer? 

    @IBInspectable public var edgeInset: CGFloat = 10 

    public var image: NSImage? { 
     didSet { 
      if let newImage = image { 
       imageLayer?.contents = newImage 
      } 
     } 
    } 

    // MARK: New in this class 

    private func prepareLayer() { 
     // I had to remove my own created layer. 
     self.wantsLayer = true 
    } 

    private func drawImage() { 
     var newImageLayer = CALayer() 
     newImageLayer.contentsGravity = kCAGravityResizeAspect 
     if let imageToSet = image { 
      // I didn't lock the focus on the imageToSet. 
      imageToSet.lockFocus() 
      newImageLayer.contents = imageToSet 
      // I didn't unlock the focus either. 
      imageToSet.unlockFocus() 
     } 
     let insetBounds = CGRectInset(self.bounds, edgeInset, edgeInset) 
     newImageLayer.frame = insetBounds 
     newImageLayer.backgroundColor = NSColor(calibratedWhite: 0.8, alpha: 1).CGColor 
     self.layer!.addSublayer(newImageLayer) 
     imageLayer = newImageLayer 
    } 

    // MARK: NSView stuff 

    public override init(frame frameRect: NSRect) { 
     super.init(frame: frameRect) 
     prepareLayer() 
    } 

    public required init?(coder: NSCoder) { 
     super.init(coder: coder) 
     prepareLayer() 
    } 

    public override func viewWillDraw() { 
     super.viewWillDraw() 

     drawImage() 
    } 

    public override func prepareForInterfaceBuilder() { 
     super.prepareForInterfaceBuilder() 
     // Load default test image. 
     println("\(self): prepareForInterfaceBuilder") 
     let processInfo = NSProcessInfo.processInfo() 
     let environment = processInfo.environment 
     let projectSourceDirectories : AnyObject = environment["IB_PROJECT_SOURCE_DIRECTORIES"]! 
     let directories = projectSourceDirectories.componentsSeparatedByString(":") 

     if directories.count != 0 { 
      let firstPath = directories[0] as! String 
      let imagePath = firstPath.stringByAppendingPathComponent("CircularView/Bz1dSvR.jpg") 

      let image = NSImage(contentsOfFile: imagePath) 
      image!.setName("Test Image") 
      self.image = image 
     } 
    } 
}