Swift 在炉中的图像和活力
我在这里遗漏了一些东西。我在Interface Builder中工作很活跃。我可以使用NSImage.draw rect在NSView中绘制图像。因此图像加载正确。然而,当我把它放进加莱尔的时候,它并没有出现。 我是否错过了NSView上关于行为的内容?卡拉耶?层托管?还是别的什么 以下是视图的代码:Swift 在炉中的图像和活力,swift,calayer,nsview,nsimage,quartz-core,Swift,Calayer,Nsview,Nsimage,Quartz Core,我在这里遗漏了一些东西。我在Interface Builder中工作很活跃。我可以使用NSImage.draw rect在NSView中绘制图像。因此图像加载正确。然而,当我把它放进加莱尔的时候,它并没有出现。 我是否错过了NSView上关于行为的内容?卡拉耶?层托管?还是别的什么 以下是视图的代码: import Foundation import AppKit import QuartzCore @IBDesignable public class CircularImageView: N
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
}
}
}
提前谢谢。好了,伙计们,我找到答案了。 我在这段代码中做错了两件事。我正在处理一个层托管视图,我只需要一个层备份视图。我不知道有什么不同。在将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
}
}
}
你能解释一下这句话吗:
让myLayer=CALayer()
?您正在创建一个CALayer,然后立即将其丢弃。这应该是self.layer=CALayer(),谢谢,但仍然不起作用。好的,请编辑以修复问题中的代码。不要展示糟糕的代码,也不要指望别人读懂你的心思。对不起,我是个不问问题的人。谢谢你的帮助。