放大、缩小时播放 "snap in/snap out" 动画
Playing a "snap in/snap out" animation during zoom in, zoom out
所以我得到了一套戒指,一个套在另一个里面。我希望能够放大然后放大,当我放大到足够近时,缩放应该使捕捉动画,然后我应该再次放大。
我已经使用 CGAffineTransform 和 UIPinchGesture 识别器轻松完成了缩放部分,这里是缩放方法的样子:
func scale(gesture: UIPinchGestureRecognizer) {
if !animationInProgress {
for var i = 0; i < scrollViews.count; i++ {
var view = scrollViews[i]
var j = 0
for ; j < scrollViews.count; j++ {
if view == scrollViews[j] {
break
}
}
println("Animation in progress: \(animationInProgress)")
if view.frame.origin.x < -80 || view.frame.origin.y < -140 {
if !view.hidden {
currentViewIndex = j + 1
view.hidden = true
view.visible = false
println("new view got out of the screen")
snapIn = true
animateSnap(snapIn)
}
} else {
if view.hidden == true {
currentViewIndex = j
view.hidden = false
view.visible = true
println("new view got into the screen")
snapIn = false
animateSnap(snapIn)
}
}
view.transform = CGAffineTransformScale(view.transform, gesture.scale, gesture.scale)
println("transformed")
}
gesture.scale = 1
}
}
所以我们遍历我们的视图,frame.origin x 和 y 检查,视图是否超出屏幕,我设置了一些标志,这轮到一些计算。
想法如下,当一个圆圈离开屏幕时,其余的动画放大和缩小,当新视图出现在屏幕上时。
这是一个 animateSnap 函数:
private func animateSnap(snapIn: Bool) {
let factor: CGFloat = snapIn ? 1.5 : 0.5
for var a = currentViewIndex; a < scrollViews.count; a++ {
let next = scrollViews[a]
var transformAnimation = CABasicAnimation(keyPath: "transform")
transformAnimation.duration = 1
transformAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
transformAnimation.removedOnCompletion = false
transformAnimation.fillMode = kCAFillModeForwards
transformAnimation.delegate = self
let transform = CATransform3DScale(next.layer.transform, factor, factor, 1)
transformAnimation.toValue = NSValue(CATransform3D:transform)
next.layer.addAnimation(transformAnimation, forKey: "transform")
}
}
问题是:有人知道对此的优雅解决方案或发现我的方法有任何缺陷吗?问题发生在动画结束时,视图有点回到开始时的位置。我不知道为什么,因为 remove on completion 设置为 false。此外,我使用 CGAffineTransform 进行缩放和使用 CATransform3D 是否会以某种方式影响结果?
非常感谢!
对于可能遇到相同问题的每个人,当您使用 2D 时,请使用 CGAffineTransform 而不是 CATransform3D。这解决了问题,此外我怀疑他们也改变了不同的东西(例如,CATransform3D 改变层),这就是为什么当动画完成时结果看起来不像预期的那样。
所以我得到了一套戒指,一个套在另一个里面。我希望能够放大然后放大,当我放大到足够近时,缩放应该使捕捉动画,然后我应该再次放大。
我已经使用 CGAffineTransform 和 UIPinchGesture 识别器轻松完成了缩放部分,这里是缩放方法的样子:
func scale(gesture: UIPinchGestureRecognizer) {
if !animationInProgress {
for var i = 0; i < scrollViews.count; i++ {
var view = scrollViews[i]
var j = 0
for ; j < scrollViews.count; j++ {
if view == scrollViews[j] {
break
}
}
println("Animation in progress: \(animationInProgress)")
if view.frame.origin.x < -80 || view.frame.origin.y < -140 {
if !view.hidden {
currentViewIndex = j + 1
view.hidden = true
view.visible = false
println("new view got out of the screen")
snapIn = true
animateSnap(snapIn)
}
} else {
if view.hidden == true {
currentViewIndex = j
view.hidden = false
view.visible = true
println("new view got into the screen")
snapIn = false
animateSnap(snapIn)
}
}
view.transform = CGAffineTransformScale(view.transform, gesture.scale, gesture.scale)
println("transformed")
}
gesture.scale = 1
}
}
所以我们遍历我们的视图,frame.origin x 和 y 检查,视图是否超出屏幕,我设置了一些标志,这轮到一些计算。
想法如下,当一个圆圈离开屏幕时,其余的动画放大和缩小,当新视图出现在屏幕上时。
这是一个 animateSnap 函数:
private func animateSnap(snapIn: Bool) {
let factor: CGFloat = snapIn ? 1.5 : 0.5
for var a = currentViewIndex; a < scrollViews.count; a++ {
let next = scrollViews[a]
var transformAnimation = CABasicAnimation(keyPath: "transform")
transformAnimation.duration = 1
transformAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
transformAnimation.removedOnCompletion = false
transformAnimation.fillMode = kCAFillModeForwards
transformAnimation.delegate = self
let transform = CATransform3DScale(next.layer.transform, factor, factor, 1)
transformAnimation.toValue = NSValue(CATransform3D:transform)
next.layer.addAnimation(transformAnimation, forKey: "transform")
}
}
问题是:有人知道对此的优雅解决方案或发现我的方法有任何缺陷吗?问题发生在动画结束时,视图有点回到开始时的位置。我不知道为什么,因为 remove on completion 设置为 false。此外,我使用 CGAffineTransform 进行缩放和使用 CATransform3D 是否会以某种方式影响结果?
非常感谢!
对于可能遇到相同问题的每个人,当您使用 2D 时,请使用 CGAffineTransform 而不是 CATransform3D。这解决了问题,此外我怀疑他们也改变了不同的东西(例如,CATransform3D 改变层),这就是为什么当动画完成时结果看起来不像预期的那样。