iOS 自定義轉(zhuǎn)場動畫。

以前對iOS 的專場動畫一直不敢去動自定義動畫(非交互式) 怕自己搞不好,最近無事就突突一下。發(fā)現(xiàn)沒有想象的那么難?。?strong>大神就莫見笑。純屬自我學(xué)習(xí))
儲備只是 簡單UIView動畫。僅此而已,
能看懂 代理 協(xié)議神馬的。

首先我們以PresentViewController 為例簡單說一下 蘋果自己定義了幾種動畫效果這里就不說了;上代碼! 創(chuàng)建一個Button

- (IBAction)presentaction:(id)sender { UIViewController * vc = [[UIViewController alloc]init]; [vc.view setBackgroundColor:[UIColor yellowColor]]; 
//將呈現(xiàn)樣式選為定值型 自己定義
 [vc setModalPresentationStyle:UIModalPresentationCustom]; 
//過度代理設(shè)為自己,這里是要點!一定要制定一個代理是它的過渡動畫走它的代理。沒用過的同學(xué)可以進去看看代理方法 
[vc setTransitioningDelegate:self]; NSLog(@"%s\nvc.view:%@\nself.view:%@\nself.navigationController.view:%@",__func__,vc.view,self.view,self.navigationController.view);
 [self.navigationController presentViewController:vc animated:YES completion:^{ for(UIView * v in self.navigationController.view.subviews){ NSLog(@"%@",v); } }];
}

上面之所以打很多l(xiāng)og 是為了想弄明白一個

 UIView * containerView = [transitionContext containerView];

這個view 是個神馬鬼。下面再說
看完UIViewControllerTransitioningDelegate的同學(xué)是不是發(fā)現(xiàn)點什么。非交互轉(zhuǎn)場動畫就看前兩個就ok 交互式下次再說。

/*開始彈出時走的方法。 返回一個實現(xiàn)UIViewControllerAnimatedTransitioning的對象*/
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
/*消失時走的方法。 返回一個實現(xiàn)UIViewControllerAnimatedTransitioning的對象*/
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed;

從上面可以看出不管是呈現(xiàn)還是消失都會返回一個實現(xiàn)UIViewControllerAnimatedTransitioning的對象。所以呢 我們需要創(chuàng)建一個對象實現(xiàn)UIViewControllerAnimatedTransitioning這玩意兒 點協(xié)議進去后你發(fā)現(xiàn)只有3個方法!兩個必須實現(xiàn)的!

- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;@optional- (void)animationEnded:(BOOL) transitionCompleted;

管它什么鬼先實現(xiàn)再說

- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext{ 
return 1;
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{}

第一個方法沒啥說的動畫時間。關(guān)鍵看第二個方法如下

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{
 UIView * containerView = [transitionContext containerView];
//暫時我理解為一個容器View 動畫在它內(nèi)實現(xiàn) 如有錯誤請留言打臉!小弟多謝! 
NSLog(@"containerView:%@",containerView); UIViewController * fromeVC = 
[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
//字面意思來自哪個VC UIViewController * toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
//字面意思將呈現(xiàn)哪個VC 
NSLog(@"fromeVC.view:%@\ntoVC.view:%@",fromeVC.view,toVC.view); 
[toVC.view setFrame:containerView.frame]; toVC.view.layer.anchorPoint = 
CGPointMake(0.5, 1); toVC.view.layer.position = CGPointMake(containerView.center.x, containerView.frame.size.height); fromeVC.view.layer.position = CGPointMake(containerView.center.x, containerView.frame.size.height); 
fromeVC.view.layer.anchorPoint = CGPointMake(0.5, 1);
 [containerView addSubview:toVC.view];
 /*動畫自己*/
 [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{ 
[fromeVC.view setFrame:CGRectMake(20, 20, containerView.bounds.size.width-40, containerView.frame.size.height-10)]; 
toVC.view.transform = CATransform3DGetAffineTransform(CATransform3DMakeRotation(-0.5,0.3,0,0)); 
} completion:^(BOOL finished) { 
/*結(jié)束過渡*/
 [transitionContext completeTransition:YES];
 }];

然后回到剛vc 的

- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0)
{ 
    vcAnimation * animation = [[vcAnimation alloc]init]; return animation;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS 7 以協(xié)議的方式開放了自定義轉(zhuǎn)場的 API,協(xié)議的好處是不再拘泥于具體的某個類,只要是遵守該協(xié)議的對象都能...
    iceMaple閱讀 2,087評論 0 13
  • 像我們平常用的最多的就是presentViewController:animated:completion:和對應(yīng)...
    牛奈奈閱讀 751評論 4 3
  • 有人為你去看自己從不看的電影,有人要預(yù)習(xí)復(fù)習(xí)。有人為你心酸無奈,有人為你欣喜微笑內(nèi)心柔軟。我還是一如既往決定不為你...
    太陽愛看書閱讀 193評論 0 0
  • Q81 至少閱讀一本你崇拜的人的自傳,在日記里面記錄下那些尤其讓你感興趣的部分,以及那些最感動你的部分。 Q82 ...
    商未央閱讀 159評論 0 1
  • 這兩天在開發(fā)過程中遇到一個坑的不行的問題,坑的我都拾起了荒廢3個月的簡書了=_=!先貼一張圖,大家要是遇到這種情況...
    Booooooooom閱讀 711評論 0 1

友情鏈接更多精彩內(nèi)容