NSImage в CALayer и Liveness

Я кое-что упустил. Я получил Liveness для работы в Interface Builder. Я могу нарисовать изображение в NSView с помощью NSImage.draw rect. Так что изображение загружается правильно. Однако, когда я помещаю это в CALayer, он не отображается. Я что-то пропустил в поведении NSView? CALayer? Layer Hosting? Или что-то другое?

Вот код представления:

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
        }
    }
}

Заранее спасибо.


person I make my mark    schedule 04.05.2015    source источник
comment
Вы можете объяснить эту строчку: let myLayer = CALayer()? Вы создаете CALayer, а затем немедленно его выбрасываете.   -  person matt    schedule 04.05.2015
comment
Это должно быть self.layer = CALayer () Спасибо, но все еще не работает.   -  person I make my mark    schedule 04.05.2015
comment
Хорошо, но отредактируйте, чтобы исправить код вопроса. Не показывайте плохой код и не ждите, что люди прочитают ваши мысли.   -  person matt    schedule 04.05.2015
comment
Извини, я такой новичок, что задаю вопросы. Спасибо за помощь.   -  person I make my mark    schedule 04.05.2015


Ответы (1)


Ладно, ребята, я нашел ответ. Я сделал две ошибки в этом коде. Я работал над представлением размещения слоев, и мне просто нужно было представление с поддержкой слоев. Я не знал, что есть разница. И перед добавлением NSImage к содержимому CALayer мне нужно было охватить его с помощью 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
        }
    }
} 
person I make my mark    schedule 06.05.2015