我想创建一个自定义动画,其中卡片堆叠在卡座上。新视图将是最顶级的卡。这些卡应该掉下来,一张卡可以正常使用。困难在于使不止一张卡掉落。到目前为止,这就是我的代码:
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)})
}
我的目标是复制视图的下降动画,使其看起来有几张卡片掉落。现在,这会导致黑屏。
答案 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。