2015-05-21 4 views
0

Я читал 12th number of Objc.io и столкнулся с проблемой при попытке первой части кода. В первой части «A Basic Animation» последняя часть кода использует byValue для интерполяции свойства с использованием начального значения свойства и добавления byValue.CABasicAnimation byValue странное поведение

Итак, я попробовал код в своем проекте и обнаружил, что он не работает и имел действительно странное поведение.

Вот очень короткий GIF, иллюстрирующий проблему:

Gif video illustrating the bug

И вот только код, я использую:

class ViewController: UIViewController { 

    var rocket1: UIView! 
    var rocket2: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     rocket1 = UIView(frame: CGRect(x: 20, y: 100, width: 50, height: 20)) 
     rocket1.backgroundColor = UIColor.redColor() 
     rocket2 = UIView(frame: CGRect(x: 20, y: 150, width: 50, height: 20)) 
     rocket2.backgroundColor = UIColor.blueColor() 

     self.view.addSubview(rocket1) 
     self.view.addSubview(rocket2) 

    } 

    @IBAction func button() { 
     let animation = CABasicAnimation(keyPath: "position.x") 
     animation.byValue = 300 
     animation.duration = 1 

     rocket1.layer.addAnimation(animation, forKey: "basic") 
     rocket1.layer.position.x += 300 

     animation.beginTime = CACurrentMediaTime() + 0.5 

     rocket2.layer.addAnimation(animation, forKey: "basic") 
     rocket2.layer.position.x += 300 

    } 
} 

Если вы хотите попробовать этот проект вот полный проект (использование симулятора iPhone или форм будет скрыто, потому что 5S слишком «короткое»): https://dl.dropboxusercontent.com/u/378166/VCoreAnimation.zip

+1

Я не считаю это странным. Это довольно близко к поведению «аддитивных» анимаций, как [объяснено здесь] (http://ronnqvi.st/multiple-animations/) –

+0

@ DavidRönnqvist Действительно интересно поблагодарить вас за ссылку на вашу статью! – Fantattitude

ответ

1

вы должны создать питался блок завершения этой анимации, как это:

@IBAction func button() { 
    let animation = CABasicAnimation(keyPath: "position.x") 
    animation.byValue = 300 
    animation.duration = 1 

    CATransaction.begin() 
    CATransaction.setCompletionBlock({ 
     rocket1.layer.position.x += 300 
    }) 
    rocket1.layer.addAnimation(animation, forKey: "basic") 
    CATransaction.commit() 

    animation.beginTime = CACurrentMediaTime() + 0.5 

    CATransaction.begin() 
    CATransaction.setCompletionBlock({ 
     rocket2.layer.position.x += 300 
    }) 
    rocket2.layer.addAnimation(animation, forKey: "basic") 
    CATransaction.commit() 
} 

В этом случае нам нужны 2 CATransaction блоки, так как у нас есть 2 анимации, работающая с временным различию друг от друга.

+0

Да, я подумал об этом, но разве это не странно, что вы должны это сделать? Когда вы используете fromValue & toValue, вам не нужно использовать finalBlock, он просто работает без (поскольку анимация запускается до изменения modelLayer). – Fantattitude

Смежные вопросы