自定义过渡动画"堆叠卡"

时间:2014-12-17 23:49:36

标签: ios uiviewanimation

我想创建一个自定义动画,其中卡片堆叠在卡座上。新视图将是最顶级的卡。这些卡应该掉下来,一张卡可以正常使用。困难在于使不止一张卡掉落。到目前为止,这就是我的代码:

 func animateTransition(transitionContext: UIViewControllerContextTransitioning){
    let container = transitionContext.containerView()
    let fromView  = transitionContext.viewForKey(UITransitionContextFromViewKey)
    let toViewContoller = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) as LWCBigCardRootViewController
    let numberOfCards = toViewContoller.currentCardDeck.questions.count

    let offScreen = CGAffineTransformMakeScale(1.5, 1.5)

    toViewContoller.view.alpha = 0
    toViewContoller.view.transform = offScreen

    container.addSubview(fromView!)
    container.addSubview(toViewContoller.view) 
    let duration = transitionDuration(transitionContext)

    UIView.animateWithDuration(transitionDuration(transitionContext), animations: {
        for (var i = 0; i < numberOfCards; i++){
            UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: {
                toViewContoller.view.alpha = 1
                toViewContoller.view.transform = CGAffineTransformIdentity
                }, completion: {(ok) in
                    toViewContoller.view.alpha = 0
                    toViewContoller.view.transform = offScreen
                })
            }
        toViewContoller.view.alpha = 1
        toViewContoller.view.transform = CGAffineTransformIdentity
    },
        completion: {(finished) in transitionContext.completeTransition(true)})
}

我的目标是复制视图的下降动画,使其看起来有几张卡片掉落。现在,这会导致黑屏。

1 个答案:

答案 0 :(得分:0)

可能的解决方案

也许不是最干净的方式,但这对我有用:

func startCardStacking(context: UIViewControllerContextTransitioning, numberOfCards: Int){
    cards = numberOfCards
    cards--

    var plainCard = UIImageView(image: UIImage(named:"Card"))
    plainCard.frame = toViewController.view.frame

    let offScreen = CGAffineTransformMakeScale(1.5, 1.5)
    plainCard.alpha = 0
    plainCard.transform = offScreen
    container.addSubview(plainCard)

    UIView.animateWithDuration(transitionDuration(context), animations: {
        plainCard.alpha = 1
        plainCard.transform = CGAffineTransformIdentity
        }, completion: {(lastOne) in if(self.cards == 0){
            self.stackLastCard(context)
            }else{
            self.stackCard(context)
            }
        })
}


func stackCard(context: UIViewControllerContextTransitioning){
    cards--

    var plainCard = UIImageView(image: UIImage(named: "Card"))
    plainCard.frame = container.frame

    let offScreen = CGAffineTransformMakeScale(1.5, 1.5)
    plainCard.alpha = 0
    plainCard.transform = offScreen
    container.addSubview(plainCard)

    UIView.animateWithDuration(transitionDuration(context), animations: {
        plainCard.alpha = 1
        plainCard.transform = CGAffineTransformIdentity
        }, completion: {(lastOne) in if(self.cards == 0){
            self.stackLastCard(context)
        }else{
            self.stackCard(context)
        }
    })

}

func stackLastCard(context: UIViewControllerContextTransitioning){
    let offScreen = CGAffineTransformMakeScale(1.5, 1.5)
    toViewController.view.alpha = 0
    toViewController.view.transform = offScreen
    container.addSubview(toViewController.view)

    UIView.animateWithDuration(transitionDuration(context), animations: {
        self.toViewController.view.alpha = 1
        self.toViewController.view.transform = CGAffineTransformIdentity
        }, completion: {(lastOne) in
        context.completeTransition(true)
        })
}

然后只需在animateTransition方法中调用startStackingCards。