Animation 卡拉耶';丢失';隐式动画期间从类外设置的值

Animation 卡拉耶';丢失';隐式动画期间从类外设置的值,animation,swift,calayer,Animation,Swift,Calayer,我有一个CLLayer,在Swift的自定义属性上有一个隐式动画。 在动画期间,我可以从类内部访问属性的插值。但是,当我使用从类外部设置的其他属性时,它们在动画期间没有值。动画结束后,原始值再次可用 因此,在下面的示例中,people有五个随机值,它们以drawInContext格式打印到控制台,但是当动画运行时,people是空的 这是我的定制卡莱耶 class BackgroundLayer: CALayer { @NSManaged var range: Double v

我有一个CLLayer,在Swift的自定义属性上有一个隐式动画。 在动画期间,我可以从类内部访问属性的插值。但是,当我使用从类外部设置的其他属性时,它们在动画期间没有值。动画结束后,原始值再次可用

因此,在下面的示例中,people有五个随机值,它们以drawInContext格式打印到控制台,但是当动画运行时,people是空的

这是我的定制卡莱耶

class BackgroundLayer: CALayer {

    @NSManaged var range: Double
    var people: []

    override class func needsDisplayForKey(key: String) -> Bool {
        if key == "range" {
            return true
        }
        return super.needsDisplayForKey(key)
    }

    override func drawInContext(ctx: CGContext!) {

        let center = CGPoint(x: Double(bounds.width)/2, y: Double(bounds.height)-bottomOffset)
        let xDist = Double(bounds.width)
        let yDist = Double(bounds.height)-bottomOffset-minRadius
        let maxDistance = sqrt(pow(xDist,2) + pow(yDist,2))
        let radius = CGFloat(minRadius + range * maxDistance)

        CGContextSetFillColorWithColor(ctx, UIColor(red: 208/255, green: 2/255, blue: 27/255, alpha: 1).CGColor)
        CGContextFillEllipseInRect(ctx, CGRectMake(center.x-radius, center.y-radius, radius*2, radius*2))

        println("are there people? \(people)")
    }

    override func actionForKey(event: String!) -> CAAction! {

        if event == "range" {
            var currentValue = self.presentationLayer().valueForKey(event) as Double
            if currentValue == 0 {
                currentValue = self.range
            }
            var rangeAnim = CABasicAnimation(keyPath: event)
            rangeAnim?.fromValue = currentValue
            rangeAnim?.duration = 0.5
            return rangeAnim
        }

        return super.actionForKey(event)
    }
}
这就是我在UIViewController中使用它的方式,它设置了五个随机值

class ViewController: UIViewController {

    private let backgroundLayer = BackgroundLayer()

    override func viewDidLoad() {
        super.viewDidLoad()

        for index in 0..<5 {

            println()
            let point = (x: Double(arc4random_uniform(UInt32(view.frame.width))), y: Double(arc4random_uniform(UInt32(view.frame.height))))
            backgroundLayer.people.append(point)
        }
        println(backgroundLayer.people)
    }

    override func viewWillLayoutSubviews() {
        backgroundLayer.contentsScale = UIScreen.mainScreen().scale
        backgroundLayer.frame = self.view.frame
        self.view.layer.addSublayer(backgroundLayer)
        backgroundLayer.setNeedsDisplay()
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        backgroundLayer.range = 1
    }

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        backgroundLayer.range = 0
    }
}
类ViewController:UIViewController{
私人出租背景层=背景层()
重写func viewDidLoad(){
super.viewDidLoad()
对于0中的索引。。