iOS 自訂轉場動畫篇

來源:互聯網
上載者:User

標籤:

前言: 自訂轉場動畫其實並不難, 關鍵在於能夠明白思路, 也就是操作步驟. 本篇部落客要以present轉場動畫為例, 進行分析, 操作, 如有錯誤歡迎簡信與我交流.

不進行修改的話, presentViewController:animated:completion:相信這個方法很多人都是用過, 稱作模態推出介面, 預設都是從螢幕下方推出新的控制器.
自訂的目的就是為了修改固定的推出方式, 同時加上你想要的動畫.

一個關鍵的概念: UIViewControllerAnimatedTransitioning控制動畫的協議, 需要自己實現這個. 下面來一看看代碼如何進行實現.

@interface ViewController ()<UIViewControllerTransitioningDelegate>
跳轉點擊方法
- (void)click:(UIButton *)sender{    ModelViewController *modalViewController = [ModelViewController new];    // 指定代理    modalViewController.transitioningDelegate = self;    // Style = 自訂方式    modalViewController.modalPresentationStyle = UIModalPresentationCustom;    [self presentViewController:modalViewController                                            animated:YES                                          completion:NULL];}
UIViewControllerTransitioningDelegate
// 修改動畫的兩個相關的協議方法, 建議仔細查看UIViewControllerTransitioningDelegate裡面的注釋-(id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented                                                                  presentingController:(UIViewController *)presenting                                                                      sourceController:(UIViewController *)source{    // 推齣動畫 - 下面會給出代碼 我參照POP動畫Demo寫的.    return [PresentAnimator new];}- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed{    // 退出     return [DismissAnimator new];}// 想要實現手勢控制可在這個方法中進行修改-(id<UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id<UIViewControllerAnimatedTransitioning>)animator {}
關鍵在於動畫如何? 分別進行的實現PresentAnimator, DismissAnimator的實現.

UIViewControllerAnimatedTransitioning使用這個協議進行修改.

@interface PresentAnimator : NSObject <UIViewControllerAnimatedTransitioning>

PresentAnimator.m

// 互動所用時間- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext{    return 0.5f;}// 具體動畫方式, 上面提到的POP- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{    // 這裡拿到即將新推出的VC的View    UIView *toView = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey].view;    // 這裡設定退出view具體如何設定    toView.frame = CGRectMake(0,0, SCREEN_WIDTH, SCREEN_HEIGHT);    toView.center = CGPointMake(transitionContext.containerView.center.x, -transitionContext.containerView.center.y);        [transitionContext.containerView addSubview:toView];    // pop動畫     POPSpringAnimation *positionAnim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionY];    positionAnim.toValue = @(transitionContext.containerView.center.y);    positionAnim.springBounciness = 10;    [positionAnim setCompletionBlock:^(POPAnimation *anim, BOOL finished) {        [transitionContext completeTransition:YES];    }];    POPSpringAnimation *scaleAnim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];    scaleAnim.springBounciness = 20;    scaleAnim.fromValue = [NSValue valueWithCGPoint:CGPointMake(1.2, 1.4)];        [toView.layer pop_addAnimation:positionAnim forKey:@"positionAnimation"];    [toView.layer pop_addAnimation:scaleAnim forKey:@"scaleAnimation"];}

DismissAnimator.m

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext{    return 0.5f;}- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{    // fromVC 很好理解吧?? 就是從哪個控制器推過來回到哪裡去.    UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];    POPBasicAnimation *offscreenAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionY];    offscreenAnimation.toValue = @(-fromVC.view.layer.position.y);    [offscreenAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {        [transitionContext completeTransition:YES];    }];    [fromVC.view.layer pop_addAnimation:offscreenAnimation forKey:@"offscreenAnimation"];}

順便值得一提的是UINavigationController轉場的動畫也是可以自訂的. 通過這個
UINavigationControllerDelegate
來完成

    // 簽訂這個協議    self.navigationController.delegate = self;
- (id<UIViewControllerAnimatedTransitioning>) navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC{        if (operation == UINavigationControllerOperationPush) {        // 動畫的方式不變        return [PresentAnimator new];    }else{        return nil;    }}

iOS 自訂轉場動畫篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.