将 CAShapeLayer 转换为在 NSImageView 中使用

Converting a CAShapeLayer to use in an NSImageView

我正在尝试为 Mac 应用移植一些 iOS 代码。我的代码如下:

func innerRing() {
    let innerRing = CAShapeLayer()
    let circleRadius: CGFloat = 105.0
    innerRing.frame = InnerRingView.bounds

    func circleFrame() -> CGRect {
        var circleFrame = CGRect(x: 0, y: 0, width: 2*circleRadius, height: 2*circleRadius)
        circleFrame.origin.x = CGRectGetMidX(InnerRingView.bounds) - CGRectGetMidX(circleFrame)
        circleFrame.origin.y = CGRectGetMidY(InnerRingView.bounds) - CGRectGetMidY(circleFrame)
        return circleFrame
    }

    innerRing.path = UIBezierPath(ovalInRect: circleFrame()).CGPath
    innerRing.lineWidth = 3.0
    innerRing.strokeStart = 0.0
    innerRing.strokeEnd = 1.0
    innerRing.fillColor = UIColor.clearColor().CGColor
    innerRing.strokeColor = UIColor(red: 147.0/255.0, green: 184.0/255.0, blue: 255.0/255.0, alpha: 1.0).CGColor
    InnerRingView.layer.addSublayer(innerRing)
}

这段代码效果很好,尤其是在调整填充颜色、描边颜色和描边方面start/end。

在我的 Mac 应用程序中,我实际上是在尝试使用相同的代码,但将其应用于 NSImageView(我希望它能够出现在 table,我会根据该行的详细信息调整某些参数(例如颜色)。

任何人都可以协助指导将这个简单的圆圈添加到 NSImageView 吗?

为什么要使用 NSImageViewNSImageView 用于显示图像(图标、图片等)。

改为自定义 NSView。请记住,与 UIKit 的 UIView 不同,NSView 默认不获取图层,因此您需要通过将 wantsLayer 设置为 true.[=18 来告诉它。 =]

像这样:

class CircleView: NSView {

    lazy var innerRing: CAShapeLayer = {
        let innerRing = CAShapeLayer()
        let circleRadius: CGFloat = 105.0
        innerRing.frame = self.bounds

        var circleFrame = CGRect(x: 0, y: 0, width: circleRadius, height: circleRadius)
            circleFrame.origin.x = CGRectGetMidX(self.bounds) - CGRectGetMidX(circleFrame)
            circleFrame.origin.y = CGRectGetMidY(self.bounds) - CGRectGetMidY(circleFrame)

        innerRing.path = CGPathCreateWithEllipseInRect(circleFrame, nil)
        innerRing.lineWidth = 3.0
        innerRing.strokeStart = 0.0
        innerRing.strokeEnd = 1.0
        innerRing.fillColor = NSColor.clearColor().CGColor
        innerRing.strokeColor = NSColor(red: 147.0/255.0, green: 184.0/255.0, blue: 255.0/255.0, alpha: 1.0).CGColor
        return innerRing
    }()

    override func awakeFromNib() {
        super.awakeFromNib()

        wantsLayer = true
        layer = CALayer()
        layer?.addSublayer(innerRing)
    }

}