? ? ? 關(guān)于轉(zhuǎn)場動畫我也只是一個新人,最近也是正好需要用到才研究了下,發(fā)現(xiàn)這東西太好玩了,基本可以實現(xiàn)各種炫酷的轉(zhuǎn)場的特效,瞬間讓你的app高大上有沒有。
? ? ? View Controller 轉(zhuǎn)場是iOS7 引入的新特性自定義,也就是說只有ios7以后才能用吧,但是就目前來講基本可以忽略不兼容的情況。
首先:
iOS 7 自定義視圖控制器轉(zhuǎn)場的 API 基本上都是以協(xié)議的方式提供的。最主要的五個組件如下:
動畫控制器 (Animation Controllers)遵從UIViewControllerAnimatedTransitioning協(xié)議,并且負責實際執(zhí)行動畫。
交互控制器 (Interaction Controllers)通過遵從UIViewControllerInteractiveTransitioning協(xié)議來控制可交互式的轉(zhuǎn)場。
轉(zhuǎn)場代理 (Transitioning Delegates)根據(jù)不同的轉(zhuǎn)場類型方便的提供需要的動畫控制器和交互控制器。
轉(zhuǎn)場上下文 (Transitioning Contexts)定義了轉(zhuǎn)場時需要的元數(shù)據(jù),比如在轉(zhuǎn)場過程中所參與的視圖控制器和視圖的相關(guān)屬性。 轉(zhuǎn)場上下文對象遵從UIViewControllerContextTransitioning協(xié)議,并且這是由系統(tǒng)負責生成和提供的。
轉(zhuǎn)場協(xié)調(diào)器(Transition Coordinators)可以在運行轉(zhuǎn)場動畫時,并行的運行其他動畫。 轉(zhuǎn)場協(xié)調(diào)器遵從UIViewControllerTransitionCoordinator協(xié)議。
自定義轉(zhuǎn)場就是說,自己定義一個動畫,利用UIViewControllerAnimatedTransitioning動畫控制器,我們可以很方便的自己寫一個類并遵守UIViewControllerAnimatedTransitioning協(xié)議,然后完成相對應(yīng)的方法,主要是以下兩個方法
- (NSTimeInterval)transitionDuration:(id)transitionContext;動畫的執(zhí)行時間
- (void)animateTransition:(id)transitionContext;//動畫,我們就是要在這里面寫轉(zhuǎn)場的效果.
以下是demo里的一小段代碼
- (NSTimeInterval)transitionDuration:(id)transitionContext {? ?
return 0.7;//動畫執(zhí)行的時長
}
- (void)animateTransition:(id)transitionContext {? ? ?
? CATransform3D viewFromTransform = CATransform3DMakeRotation(M_PI/2, 0, 1, 0);? ? CATransform3D viewToTransform = CATransform3DMakeRotation(-M_PI/2, 0, 1, 0);? ? viewFromTransform.m34 = PERSPECTIVE;? ? viewToTransform.m34 = PERSPECTIVE;? ? ? UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];? ? UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];? ?
UIView *container = [transitionContext containerView];? ? ? ? //普通的左右滑動切換效果//? ?
BOOL goingRight = toVC.view.tag
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//四方立體柱轉(zhuǎn)換效果
[toVC.view.layer setAnchorPoint:CGPointMake(0, 0.5)];
[fromVC.view.layer setAnchorPoint:CGPointMake(1, 0.5)];
toVC.view.layer.transform = viewToTransform;
[container addSubview:toVC.view];
container.transform = CGAffineTransformMakeTranslation(container.frame.size.width/2.0,0);
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
fromVC.view.layer.transform = viewFromTransform;
toVC.view.layer.transform = CATransform3DIdentity;
[container setTransform:CGAffineTransformMakeTranslation(-container.frame.size.width/2.0, 0)];
} completion:^(BOOL finished) {
fromVC.view.layer.transform = CATransform3DIdentity;
toVC.view.layer.transform = CATransform3DIdentity;
[fromVC.view.layer setAnchorPoint:CGPointMake(0.5f, 0.5f)];
[toVC.view.layer setAnchorPoint:CGPointMake(0.5f, 0.5f)];
[container setTransform:CGAffineTransformIdentity];
[transitionContext completeTransition:YES];
}];
}
作為一個ios的小小工程師其實對這些api還不是很了解只能放出寫demo讓大家自己研究下了。
demo:https://github.com/taosiyu/TSYViewFromTo
