在放大期间播放“捕捉/捕捉”动画,缩小

时间:2015-05-04 05:02:37

标签: ios swift animation transform

所以我在另一个里面有一套戒指。我希望能够进行缩放,当我缩放得足够近时,缩放应该为捕捉设置动画,然后我应该再次进行缩放。

我使用CGAffineTransform和UIPinchGesture识别器很容易完成缩放部分,这里是scale方法的样子:

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")
    }
}

问题是:有人知道一个优雅的解决方案或看到我的方法有任何缺陷吗?当动画结束视图有点回到他们在开始时的位置时会发生问题。我不知道为什么因为完成时删除设置为false。另外,我可以使用CGAffineTransform进行缩放和CATransform3D以某种方式影响结果吗?

非常感谢!

1 个答案:

答案 0 :(得分:-1)

对于可能遇到同样问题的每个人,当您使用2D时,请使用CGAffineTransform而不是CATransform3D。这解决了这个问题,另外我怀疑它们也会改变不同的东西(例如,CATransform3D更改图层),这就是为什么当动画结束时结果看起来并不像预期的那样。