【问题标题】:NSImage in a CALayer and LivenessCALayer 中的 NSImage 和 Liveness
【发布时间】:2015-05-04 14:30:39
【问题描述】:

我在这里遗漏了一些东西。我让 Liveness 在 Interface Builder 中工作。我可以使用 NSImage.draw rect 在 NSView 中绘制图像。所以图像正确加载。但是,当我将其放入 CALayer 时,它不会出现。 我错过了一些关于 NSView 行为的东西吗?图层?层托管?还是别的什么?

这是视图的代码:

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

提前致谢。

【问题讨论】:

  • 你能解释一下这行吗:let myLayer = CALayer()?您正在创建一个 CALayer,然后立即将其丢弃。
  • 应该是 self.layer = CALayer() 谢谢,不过还是不行。
  • 好的,但是编辑以修复问题中的代码。不要展示糟糕的代码并期望人们能读懂你的想法。
  • 对不起,我是个问问题的菜鸟。感谢您的帮助。

标签: swift calayer nsview nsimage quartz-core


【解决方案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
        }
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多