<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      iOS 視圖控制器轉(zhuǎn)場動畫/頁面切換效果/跳轉(zhuǎn)動畫 學(xué)習(xí)

      一 學(xué)習(xí) 在 UINavigationController 中 push 和 pop 的轉(zhuǎn)場效果 

          (基于iOS7 以上的轉(zhuǎn)場方式)

      • 經(jīng)過學(xué)習(xí)了解到,重點(diǎn)分三塊:
      • (1)pushAnimation: TransitionPushAnimation 進(jìn)場效果動畫管理器 (NSObject并遵守UIViewControllerAnimatedTransitioning協(xié)議)
      • (2)popAnimation:   TransitionPopAnimation  出場效果動畫管理器 (NSObject并遵守UIViewControllerAnimatedTransitioning協(xié)議) 
      • (3)navigationPerformerObject: TransitionNavigationPerformer 對象操控轉(zhuǎn)場 (設(shè)置轉(zhuǎn)場動畫代理遵從 UINavigationControllerDelegate協(xié)議)

          

      用同一邏輯寫了兩個效果 來看, 轉(zhuǎn)場代理方法實現(xiàn)差別不大. 關(guān)鍵 是 進(jìn)出場效果,有人說”你的想象無限 動畫效果無限”. 所以掌握了轉(zhuǎn)場動畫基本實現(xiàn)基本技巧后,就應(yīng)該嘗試深入研究一下動畫效果的實現(xiàn).這里強(qiáng)調(diào)實現(xiàn)轉(zhuǎn)場動畫原理和實現(xiàn)過程

       

         1 進(jìn)場效果 和 出場效果 主要實現(xiàn) UIViewControllerAnimatedTransitioning 協(xié)議的兩個方法:

       

              (1)動畫切換的持續(xù)時間,以秒為單位
              
      - (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext

       

              (2)動畫執(zhí)行內(nèi)容
          
      - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext

           注意要點(diǎn): 判斷 動畫執(zhí)行完成結(jié)果狀態(tài)

            當(dāng)用戶做手指跟隨操作的過程中,根據(jù)操作的finished位置 要判斷此時應(yīng)該是該結(jié)束動畫 還是取消動畫.

           [transitionContext completeTransition:![transitionContext transitionWasCancelled]];

            下面手勢 就是 判斷用戶手勢跟隨進(jìn)度  :

        if ( progress > 0.5) {// 時為 完成 觸發(fā)"返回"操作

                   [self.interactionController finishInteractiveTransition];//transitionContext.transitionWasCancelled 會得到NO的回調(diào)
            } else {// 反之 為取消 保留當(dāng)前頁面

                   [self.interactionController cancelInteractiveTransition];//transitionContext.transitionWasCancelled 會得到YES的回調(diào)

            }

       

            起初因為 [transitionContext transitionWasCancelled] 狀態(tài)沒注意導(dǎo)致 頁面過渡 就那么卡住了 或者 頁面空白,種種動畫效果滯澀的問題都是 狀態(tài)信號控制不好導(dǎo)致的

       

         2 這里需要遵從UINavigationControllerDelegate協(xié)議的兩個方法,這兩個方法在對屏幕進(jìn)行翻轉(zhuǎn)的時候?qū)?dǎo)航欄控制器變化的動畫設(shè)置 :
          
      - (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController
                                interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController NS_AVAILABLE_IOS(7_0);
      
      - (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                         animationControllerForOperation:(UINavigationControllerOperation)operation
                                                      fromViewController:(UIViewController *)fromVC
                                                        toViewController:(UIViewController *)toVC  NS_AVAILABLE_IOS(7_0);

          通常寫法是把導(dǎo)航去設(shè)置和代理方法寫在對應(yīng)的視圖控制器里面,這里我們創(chuàng)建 一個對象TransitionNavigationPerformer 遵循UINavigationControllerDelegate代理方法,這樣封裝,耦合性低,并且代碼可移植性更強(qiáng).

       
          
      #import <Foundation/Foundation.h>
      @class TransitionPushAnimation;
      @class TransitionPopAnimation;
      
      @interface TransitionNavigationPerformer : NSObject <UINavigationControllerDelegate>
      
      - (instancetype)initWithNav:(id)nav; //為了操控 self.navigationController
      
      @property (weak, nonatomic)  UINavigationController *navigationController; //這里強(qiáng)調(diào)單項弱引用 
      
      @property (strong, nonatomic) TransitionPushAnimation *pushAnimation;
      
      @property (strong, nonatomic) TransitionPopAnimation *popAnimation;
      
      @property (strong, nonatomic) UIPercentDrivenInteractiveTransition *interactionController;//沒做特殊處理 就是默認(rèn)系統(tǒng)創(chuàng)建 用來控制動畫效果進(jìn)度狀態(tài)
      
      @end
      //
      //  TransitionNavigationPerformer.m
      //  SectionDemo
      //
      //  Created by HF on 17/3/29.
      //  Copyright ? 2017年 HF-Liqun. All rights reserved.
      //
      
      #import "TransitionNavigationPerformer.h"
      #import "TransitionPopAnimation.h"
      #import "TransitionPushAnimation.h"
      
      @interface TransitionNavigationPerformer ()
      {
          UIScreenEdgePanGestureRecognizer *panGesture;
      }
      
      @end
      
      @implementation TransitionNavigationPerformer
      
      - (instancetype)initWithNav:(id)nav
      {
          self = [super init];
          if (self) {
              
              self.navigationController = nav;
              // 在導(dǎo)航控制器的視圖上添加pan手勢 --> 需要從邊緣進(jìn)行拖動,在控制器轉(zhuǎn)換的時候是有用 "UIScreenEdgePanGestureRecognizer"
              panGesture = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
              panGesture.edges = UIRectEdgeLeft; //主要用作返回 left
              [self.navigationController.view addGestureRecognizer:panGesture];
              
              // 初始化動畫方案
              self.pushAnimation = [[TransitionPushAnimation alloc] init];
              self.popAnimation  = [[TransitionPopAnimation alloc] init];
          }
          return self;
      }
      
      - (void)dealloc
      {   //這里目的防止取消切換效果后 導(dǎo)航控制器仍然會對手勢持有
          [panGesture removeTarget:self action:@selector(pan:)];
          self.interactionController = nil;
      }
      
      - (void)pan:(UIScreenEdgePanGestureRecognizer *)recognizer
      {
          UIView *view = self.navigationController.view;
          CGFloat progress = [recognizer translationInView:view].x / (view.bounds.size.width * 1.0);
          progress = MIN(1.0, MAX(0.0, progress));
          
          if (recognizer.state == UIGestureRecognizerStateBegan) {
              // 創(chuàng)建過渡對象,彈出viewController
              self.interactionController = [[UIPercentDrivenInteractiveTransition alloc] init];
              [self.navigationController popViewControllerAnimated:YES];
          }
          else if (recognizer.state == UIGestureRecognizerStateChanged) {
              // 更新 interactive transition 的進(jìn)度
              [self.interactionController updateInteractiveTransition:progress];
          }
          else if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled) {
              // 完成或者取消過渡
              if (progress > 0.5) { 
                  [self.interactionController finishInteractiveTransition];
              }
              else {
                  [self.interactionController cancelInteractiveTransition];
              }
              self.interactionController = nil;
          }
      }
      
      #pragma mark - UINavigationControllerDelegate
      
      - (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                        animationControllerForOperation:(UINavigationControllerOperation)operation
                                                     fromViewController:(UIViewController *)fromVC
                                                       toViewController:(UIViewController *)toVC
      {
          if (operation == UINavigationControllerOperationPush) {
              return self.pushAnimation;
          }
          else if (operation == UINavigationControllerOperationPop) {
              return self.popAnimation;
          }
          return nil;
      }
      
      - (id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController
                               interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController {
          // 檢查是否是我們的自定義過渡
          if ([animationController isKindOfClass:[TransitionPushAnimation class]] || [animationController isKindOfClass:[TransitionPopAnimation class]]) {
              return self.interactionController;
          }
          else {
              return nil;
          }
      }
      @end

           3 方法調(diào)用

           (1)在使用的時候 要添加self.navigationController.delegate = TransitionNavigationPerformer 對象, 不需要就設(shè)置為nil

           (2)頁面viewWillDisappear 一定要立即取消代理方法 防止交互崩潰 .

          參考Demo:SectionDemo

           效果:

        

       

      參考:

      http://www.open-open.com/lib/view/open1408677710366.html

      http://www.cocoachina.com/ios/20150811/12986.html

      https://github.com/seedante/iOS-Note/wiki/ViewController-Transition

       

      posted on 2017-03-30 16:32  ACM_Someone like you  閱讀(6235)  評論(0)    收藏  舉報

      導(dǎo)航

      主站蜘蛛池模板: 亚洲成av人片一区二区| 人妻少妇精品视频专区| 午夜福利国产一区二区三区 | 国产精品中文av专线| 中文字幕国产精品专区| 国产一区二区三区精品综合| 亚洲AV午夜电影在线观看| 久热这里有精品视频播放| 久久久久久免费一区二区三区| 久久热这里只有精品66| 人妻人人做人碰人人添| 色偷偷成人综合亚洲精品| 欧美成人精品手机在线| 最新国产精品中文字幕| 成人亚欧欧美激情在线观看| 国产揄拍国产精品| 久久青青草原国产精品最新片| 亚洲AV无码久久精品成人| 最近免费中文字幕大全| 欧美性白人极品hd| 人妻少妇精品视频三区二区| 浦江县| 亚洲免费视频一区二区三区| 专干老肥熟女视频网站| 久久亚洲精品11p| 蜜臀精品一区二区三区四区| 成在线人午夜剧场免费无码| 国产亚洲欧洲AⅤ综合一区| 国产精品成人无码久久久| 国产成人永久免费av在线| 国产99视频精品免费专区| 久久99国产亚洲高清观看首页| 久久天天躁狠狠躁夜夜躁2o2o| 欧美老熟妇乱子伦牲交视频 | 亚洲成av人片乱码色午夜| 亚洲午夜av一区二区| 久久人妻公开中文字幕| 亚洲自拍精品视频在线| 日韩中文字幕有码av| 男女动态无遮挡动态图| 国产成人亚洲精品狼色在线|