CABasicAnimation byValue 奇怪的行为
CABasicAnimation byValue strange behavior
我正在阅读 12th number of Objc.io 并在尝试第一段代码时遇到了问题。
在第一部分 "A Basic Animation" 最后一段代码使用 byValue 插入一个 属性 使用初始 属性 值并添加 byValue.
所以我在我的项目中尝试了代码,发现它不工作并且有一个非常奇怪的行为。
这是一个非常简短的 gif 说明问题:
这是我使用的唯一代码:
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 6 模拟器或形状将被隐藏,因为 5S 太 "short"):https://dl.dropboxusercontent.com/u/378166/VCoreAnimation.zip
您应该像这样为此动画创建一个完成块:
@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 个动画 运行 彼此之间存在时间差。
我正在阅读 12th number of Objc.io 并在尝试第一段代码时遇到了问题。 在第一部分 "A Basic Animation" 最后一段代码使用 byValue 插入一个 属性 使用初始 属性 值并添加 byValue.
所以我在我的项目中尝试了代码,发现它不工作并且有一个非常奇怪的行为。
这是一个非常简短的 gif 说明问题:
这是我使用的唯一代码:
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 6 模拟器或形状将被隐藏,因为 5S 太 "short"):https://dl.dropboxusercontent.com/u/378166/VCoreAnimation.zip
您应该像这样为此动画创建一个完成块:
@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 个动画 运行 彼此之间存在时间差。