Преобразование CAShapeLayer для использования в NSImageView

Я пытаюсь портировать код iOS для приложения Mac. Мой код выглядит следующим образом:

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

Этот код работает очень хорошо, особенно для настройки цвета заливки, цвета обводки и начала / конца обводки.

В моем приложении Mac я эффективно пытаюсь использовать тот же код, но применяю его к NSImageView (Я хочу, чтобы он мог появляться в каждой строке таблицы, и я буду настраивать определенные параметры (например, цвет) в зависимости от того, какие детали этой строки.

Может ли кто-нибудь помочь с руководством по добавлению этого простого круга в NSImageView?

1 ответ

Решение

Почему вы хотите использовать NSImageView? NSImageView для отображения изображений (значки, картинки и т. д.).

Сделай себе обычай NSView вместо. Просто помните, что, в отличие от UIKit's UIView, NSView не получает слой по умолчанию, поэтому вам нужно указать его, установив wantsLayer в true,

Вот так:

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

}
Другие вопросы по тегам