Преобразование 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)
}
}