在NSView中使用CALayer对线条进行动画处理

我有一个NSView的自定义子类,在其中画一条水平线。 我的NSView有一个名为lineLength的属性,它定义了行的长度。

我想要触发一个让这条线增长的动画。 我使用任何鼠标点击视图作为触发器(不是强制性的,只是一个简单的方法来启动动画)。

那么,它不起作用。 我的行甚至没有画过,因为我添加了CA Layer,我不明白发生了什么。 显然,我错过了一些东西。

我应该怎么做动画我的线?

class myView: NSView
{
   var lineLength: CGFloat = 10.0

    override func awakeFromNib()
    {
        super.awakeFromNib()

        self.layer = CALayer()
        self.wantsLayer = true
        self.layer?.display()
    }

     override func drawRect(dirtyRect: NSRect)
    {
        super.drawRect(dirtyRect)

        // Drawing code here.
        let path = NSBezierPath()
        path.moveToPoint(NSMakePoint(0.0, 10.0)
        path.lineToPoint(NSMakePoint(lineLength, 10.0)
        NSColor.blackColor().set()
        path.stroke()
    }

    override func mouseDown(theEvent: NSEvent)
    {
        let animation:CABasicAnimation = CABasicAnimation()

        animation.keyPath = "lineLength";
        animation.fromValue = 10;
        animation.toValue = 500;
        animation.duration = 3;

        self.layer!.addAnimation(animation, forKey: "basic");
    }
}

一个想法是将CALayer子类化并使用它来绘制。 但我不认为我应该这样做。 通常,苹果作为更简单的解决方案。


您可以将该行作为myView的变量 - 一个CAShapeLayer。 将其添加为视图图层的子图层。

var yourLineLayer = CAShapeLayer()
// then in your awake..
layer.addSublayer(yourLineLayer)

这条线的绘图代码也会有所不同。 您可以创建路径,但是可以使用该路径设置形状图层。

yourLineLayer.path = path.CGPath()
yourLineLayer.strokeColor = UIColor.blackColor()
yourLineLayer.fillColor = UIColor.clearColor()

您可以将动画添加到该CAShapeLayer。 另外你的动画也没有做任何事情。 以下是制作线条的动画效果。

override func mouseDown(theEvent: NSEvent)
{
    let animation = CABasicAnimation(keyPath: "strokeEnd")
    animation.fromValue = 0
    animation.toValue = 1
    animation.duration = 3
    yourLineLayer.addAnimation(animation, forKey: "strokeEnd")
}
链接地址: http://www.djcxy.com/p/74201.html

上一篇: Animate a line using CALayer in NSView

下一篇: CALayer, CAConstraint & Disabling the Animation