如何使用滑动手势控制2个UIView状态之间的转换?

时间:2015-03-16 19:24:40

标签: ios cocoa-touch swift uiview core-animation

我希望能够在向左滑动的情况下在UIView的2个状态之间切换,向右滑动手势。基本上我想开始扩展视图的高度,因为用户开始向左滑动并且"收缩"当向右滑动时启动它。我可以使用CAAnimation在两个状态之间轻松制作动画,但理想情况下我想要的是控制转换的手势,而不是给它一个"持续时间"。所以基本上手势的范围被映射到高度的扩张/缩小......我做了一个很糟糕的解释自己的工作,但Apple一直这样做。

以下是我的自定义UIView如何看待这一刻:

class CustomUIView: UIView {

    @IBOutlet var swipeView: UIView!

    var shouldExecuteExpandAnimation:Bool = true;
    var shouldExecuteShrinkAnimation:Bool = true;


    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        NSBundle.mainBundle().loadNibNamed("CustomUIView", owner: self, options: nil)
        swipeView.backgroundColor = UIColor.grayColor()
        self.addSubview(self.swipeView)
    }


    func performAnimation(fromTransform:CATransform3D, toTransform:CATransform3D, duration:CFTimeInterval) {

        var animation:CABasicAnimation = CABasicAnimation(keyPath: "transform")
        animation.delegate = self
        var transformView = transform
        animation.fromValue = NSValue(CATransform3D: fromTransform)
        animation.toValue = NSValue(CATransform3D: toTransform)
        animation.duration = duration
        self.swipeView.layer.addAnimation(animation, forKey: nil)
        self.swipeView.layer.transform = toTransform

    }


    func expandView() {

        if shouldExecuteExpandAnimation {
            performAnimation(CATransform3DIdentity, toTransform: CATransform3DMakeScale(1, 4, 1), duration: 0.1)
            shouldExecuteShrinkAnimation = true;
        }

        shouldExecuteExpandAnimation = false;
    }


    func shrinkView() {

        if shouldExecuteShrinkAnimation {
            performAnimation(CATransform3DMakeScale(1, 4, 1), toTransform: CATransform3DMakeScale(1, 1, 1), duration: 0.1)
            shouldExecuteExpandAnimation = true
        }

        shouldExecuteShrinkAnimation = false;
    }


    func manageViewWithGesture(gestureRecognizer:UISwipeGestureRecognizer) {

            switch gestureRecognizer.direction {

            case UISwipeGestureRecognizerDirection.Right:
                expandView()
            case UISwipeGestureRecognizerDirection.Left:
                shrinkView()
            default:
                break
            }

    }

}

1 个答案:

答案 0 :(得分:1)

正如Aaron所说,你不能通过滑动获得中间值。没有任何事情发生,然后就会发生火灾。您需要使用平移手势识别器或您自己的自定义手势识别器。为此,可能更容易理解从标准平移手势识别器获得的翻译值。

然后,您可以使用这些值手动制作动画,从开始到结束。我在github上有一个项目,它允许你使用滑块从头到尾改变动画。

当用户拖动平移手势时,您可以调整该方法来制作动画。

点击此链接:

KeyframeViewAnimations demo project on Github