2015-05-04 21 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 
     } 
    } 
}