第六十五篇、iOS7自訂轉場動畫

來源:互聯網
上載者:User

標籤:

 自訂轉場動畫,在iOS7及以上的版本才開始出現的,在一些應用中,我們常常需要定製自訂的的跳轉動畫

1.遵守協議:<UIViewControllerAnimatedTransitioning>

2.協議的方法主要的是兩個:

// 指定動畫的持續時間長度 1. (NSTimeInterval)transitionDuration; 
// 轉場動畫的具體內容 2. (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;


#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>typedef NS_ENUM(NSUInteger, HYBControllerTransitionType) {  kControllerTransitionPush = 1 << 1,  kControllerTransitionPop = 1 << 2};@interface HYBControllerTransition : NSObject <UIViewControllerAnimatedTransitioning>+ (instancetype)transitionWithType:(HYBControllerTransitionType)transitionType                          duration:(NSTimeInterval)duration;@end

 

#import "HYBControllerTransition.h"#import "ViewController.h"#import "DetailController.h"@interface HYBControllerTransition ()@property (nonatomic, assign) HYBControllerTransitionType transitionType;@property (nonatomic, assign) NSTimeInterval duration;@end@implementation HYBControllerTransition- (instancetype)init {  if (self = [super init]) {    self.transitionType = kControllerTransitionPush;  }    return self;}+ (instancetype)transitionWithType:(HYBControllerTransitionType)transitionType                          duration:(NSTimeInterval)duration {  HYBControllerTransition *transition = [[HYBControllerTransition alloc] init];  transition.transitionType = transitionType;  transition.duration = duration;    return transition;}#pragma mark - UIViewControllerAnimatedTransitioning- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {  switch (self.transitionType) {    case kControllerTransitionPush: {      [self push:transitionContext];      break;    }    case kControllerTransitionPop: {      [self pop:transitionContext];      break;    }    default: {      break;    }  }}- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {  return self.duration;}- (void)animationEnded:(BOOL)transitionCompleted {  NSLog(@"%s", __FUNCTION__);}#pragma mark - Private- (void)pop:(id<UIViewControllerContextTransitioning>)transitionContext {  DetailController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];  ViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];  UIView *containerView = [transitionContext containerView];   UIView *toImageView = toVC.isImg1 ? toVC.img1 : toVC.img2;    UIView *tempView = containerView.subviews.lastObject;    // 第一個view是fromVC.view  // 第二個view是push進來時所產生的toImageView  for (UIView *view in containerView.subviews) {    NSLog(@"%@", view);    if (fromVC.view == view) {      NSLog(@"YES");    }  }    toImageView.hidden = YES;  tempView.hidden = NO;  // 必須保證將toVC.view放在最上面,也就是第一個位置  [containerView insertSubview:toVC.view atIndex:0];  [UIView animateWithDuration:self.duration                        delay:0.0       usingSpringWithDamping:0.55        initialSpringVelocity:1/ 0.55                      options:0                   animations:^{                     fromVC.view.alpha = 0.0;                     tempView.frame = [toImageView convertRect:toImageView.bounds toView:containerView];  } completion:^(BOOL finished) {    tempView.hidden = NO;    toImageView.hidden = NO;    [tempView removeFromSuperview];        [transitionContext completeTransition:YES];        for (UIView *view in containerView.subviews) {      NSLog(@"%@", view);      if (toVC.view == view) {        NSLog(@"YES");      }    }  }];}- (void)push:(id<UIViewControllerContextTransitioning>)transitionContext {  ViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];  DetailController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];  UIView *containerView = [transitionContext containerView];    UIView *fromImageView = fromVC.isImg1 ? fromVC.img1 : fromVC.img2;  UIView *tempView = [fromImageView snapshotViewAfterScreenUpdates:NO];  tempView.frame = [fromImageView convertRect:fromImageView.bounds toView:containerView];   UIView *toImageView = toVC.imgView;    fromImageView.hidden = YES;  toVC.view.alpha = 0.0;  toImageView.hidden = YES;    [containerView addSubview:toVC.view];  [containerView addSubview:tempView];    [UIView animateWithDuration:self.duration                        delay:0.0       usingSpringWithDamping:0.55        initialSpringVelocity:1/ 0.55                      options:0                   animations:^{                     toVC.view.alpha = 1.0;                     tempView.frame = [toImageView convertRect:toImageView.bounds toView:containerView];                   } completion:^(BOOL finished) {                     tempView.hidden = YES;                     toImageView.hidden = NO;                     [transitionContext completeTransition:YES];                   }];}@end

 

使用遵守Nav協議的方法:

#pragma mark - UINavigationControllerDelegate - (id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController {  return nil;}- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC {  if (operation == UINavigationControllerOperationPush) {    return [HYBControllerTransition transitionWithType:kControllerTransitionPush duration:0.75];  } else {    return [HYBControllerTransition transitionWithType:kControllerTransitionPop duration:0.75];  }}

 

第六十五篇、iOS7自訂轉場動畫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.