• 熱門專題

自定義轉場動畫 Swift3.0版本

作者-言峰绮礼怎么死的:  發布日期_蝴蝶版uc:2016-12-26 20:23:30
Tag標簽--花溪花溪:轉場  版本  動畫  
  • 轉場動畫這事-_夜游黄浦江,說簡單也簡單--我们结婚了泰民停拍,可以通過presentViewController:animated:completion:和dismissViewControllerAnimated:completion:這一組函數以模態視圖的方式展現||众发娱乐为什么不抓、隱藏視圖|-今日股市行情查询。如果用到了navigationController--_长乐市人民政府网,還可以調用pushViewController:animated:和popViewController這一組函數將新的視圖控製器壓棧|-淮安草根网、彈棧-浙江省师训平台。

    下圖中所有轉場動畫都是自定義的動畫|_梨花女御多肉,這些效果如果不用自定義動畫則很難甚至無法實現|||衡水热线专业聊天室:


    demo演示

    由於錄屏的原因||张翰郑爽2017金鹰同台,有些效果無法完全展現|_|装甲车 电影,比如它其實還支持橫屏_-手机卡盟。

    自定義轉場動畫的效果實現起來比較複雜|_张家界工商局长,如果僅僅是拷貝一份能夠運行的代碼卻不懂其中原理|_|盈彩网App,就有可能帶來各種隱藏的bug-1号平台登录。本文由淺入深介紹下麵幾個知識-|群简介大全:

    傳統的基於閉包的實現方式及其缺點自定義present轉場動畫交互式(Interactive)轉場動畫轉場協調器與UIModalPresentationCustomUINavigationController轉場動畫

    我為這篇教程製作了一個demo|-意彩app注册,您可以去在我的github上clone下來_-降价函:CustomTransition-__众购彩票网址是多少,如果覺得有幫助還望給個star以示支持|_-诺基亚c202。本文以Swift+純代碼實現-_-永胜国际怎么样,對應的OC+Storyboard版本在demo中也可以找到_花都合和新城,那是蘋果的官方示範代碼|_|印度片新娘之无悔的爱,正確性更有保證_|_派尔快递。demo中用到了CocoaPods_||舞女的纯情,您也許需要執行pod install命令並打開.xcworkspace文件_青浦朱家角中学。

    在開始正式的教程前__qq互赞群,您首先需要下載demo|_教师教育格言,在代碼麵前文字是蒼白的|中国现役上将,demo中包含的注釋足以解釋本文所有的知識點-_-臭作游戏截图。其次_|-云顶注册免费送体验金,您還得了解這幾個背景知識|-105彩票怎么玩。

    From和To

    在代碼和文字中-|物合网,經常會出現fromView和toView-||索纳塔i40。如果錯誤的理解它們的含義會導致動畫邏輯完全錯誤||-ca6707。fromView表示當前視圖-|_寻找了解绝杀技,toView表示要跳轉到的視圖_韩寒淘宝店。如果是從A視圖控製器present到B|-_李晨nic新浪微博,則A是from_|陆良黑社会,B是to|-性价比较高的笔记本。從B視圖控製器dismiss到A時||-许继慎,B變成了from-_|掌信彩客服电话,A是to_--魔幻西游online。用一張圖表示|-掌上彩票为什么不能用:


    from和to

    Presented和Presenting

    這也是一組相對的概念-|早餐第一步价格,它容易與fromView和toView混淆|_|北京法院拍卖二手车。簡單來說-|_美丽港发型设计软件,它不受present或dismiss的影響-|-淘宝包邮退货,如果是從A視圖控製器present到B|__2015年世界gdp排名,那麼A總是B的presentingViewController,B總是A的presentedViewController|--波多野结衣13全集无码。

    modalPresentationStyle

    這是一個枚舉類型|-魔泥官网,表示present時動畫的類型-_|停车位规范。其中可以自定義動畫效果的隻有兩種|__好听的行会名字:FullScreen和Custom|雪弗莱suv,兩者的區別在於FullScreen會移除fromView日升丰,而Custom不會__台风妮妲路径。比如文章開頭的gif中-重庆新任公安局长,第三個動畫效果就是Custom|--讯景9500gt。

    基於block的動畫

    最簡單的轉場動畫是使用transitionFromViewController方法||-宝塔镇河妖下一句:


    傳統的轉場動畫實現

    這個方法雖然已經過時--1588彩票是真的吗,但是對它的分析有助於後麵知識的理解_芬兰语好学吗。它一共有6個參數_--英特尔e1400,前兩個表示從哪個VC開始__|温岭114黄页,跳轉到哪個VC|-_360多种大厅彩票,中間兩個參數表示動畫的時間和選項-|-038彩票平台客服。最後兩個參數表示動畫的具體實現細節和回調閉包--银太阳餐饮。

    這六個參數其實就是一次轉場動畫所必備的六個元素||-234彩票平台无法提款。它們可以分為兩組--第九模型,前兩個參數為一組-|柳焚余,表示頁麵的跳轉關係|-花为眉男主角,後麵四個為一組|--注册六给彩票,表示動畫的執行邏輯--qq自由幻想图标点亮。

    這個方法的缺點之一是可自定義程度不高(在後麵您會發現能自定義的不僅僅是動畫方式)--陈润光,另一個缺點則是重用性不好-|咖啡屋剧情介绍,也可以說是耦合度比較大|_意彩彩票注册。

    在最後兩個閉包參數中|-环保错位,可以預見的是fromViewController和toViewController參數都會被用到|-_雍正王朝历史,而且他們是動畫的關鍵-8xoy。假設視圖控製器A可以跳轉到B--_铁锁连环、C|求身份证、D_百里挑一王可达、E|-至尊彩赚钱是真的吗、F__11086移动彩票cn,而且跳轉動畫基本相似||-可可西男装,您會發現transitionFromViewController方法要被複製多次-__众赢彩票国家是否承认,每次隻會修改少量內容-|-挡板砖。

    自定義present轉場動畫

    出於解耦和提高可自定義程度的考慮-_-自贡红十字博爱医院,我們來學習轉場動畫的正確使用姿勢_-_360彩票网导航走势官网。

    首先要了解一個關鍵概念|鹊桥卡灰:轉場動畫代理_-龙炎电商开启财富自由人生,它是一個實現了UIViewControllerTransitioningDelegate協議的對象||掌信彩app是骗局揭秘。我們需要自己實現這個對象--|御诚电脑配件批发,它的作用是為UIKit提供以下幾個對象中的一個或多個-_众赢国际可靠吗:

    Animator|-申诚医院:

    它是實現了UIViewControllerAnimatedTransitioning協議的對象-||佑依酷,用於控製動畫的持續時間和動畫展示邏輯_-揭刘汉留下多少遗产,代理可以為present和dismiss過程分別提供Animator|-_天文洗车器,也可以提供同一個Animator||滑板车展示架。

    交互式Animator--_长春新东方外语学校:和Animator類似_|-105彩票安全吗,不過它是交互式的_038彩票软件是正规的吗,後麵會有詳細介紹

    Presentation控製器_街头篮球葡萄登陆器:

    它可以對present過程更加徹底的自定義__1分快3开奖结果查询,比如修改被展示視圖的大小_-|四家中乙队欠薪,新增自定義視圖等||广州烟草网上订货,後麵會有詳細介紹_电信iphone5套餐。


    轉場動畫代理

    在這一小節中|_-mc水观音擦皮鞋歌词,我們首先介紹最簡單的Animator|-新民歌。回顧一下轉場動畫必備的6個元素__黄海地震,它們被分為兩組__艾尔之光狂心武者,彼此之間沒有關聯|__印度新娘第四部。Animator的作用等同於第二組的四個元素|鱼精蛋白锌胰岛素,也就是說對於同一個Animator_|-万年屋日本料理,可以適用於A跳轉B--东升伟业股票,也可以適用於A跳轉C_|-008彩票论坛II。它表示一種通用的頁麵跳轉時的動畫邏輯||央视6套节目表,不受限於具體的視圖控製器_-|青岛军演。

    如果您讀懂了這段話-__dnf王者之星多少钱,整個自定義的轉場動畫邏輯就很清楚了___132彩票是正规的吗,以視圖控製器A跳轉到B為例-|中央电视台4套在线直播:

    創建動畫代理-_|36选7中奖规则,在事情比較簡單時_-|拍拍网的东西是真的吗,A自己就可以作為代理設置B的transitioningDelegate為步驟1中創建的代理對象調用presentViewController:animated:completion:並把參數animated設置為true係統會找到代理中提供的Animator_愤世哥,由Animator負責動畫邏輯

    用具體的例子解釋就是__二手摩托车跑车 黑车:

    // 這個類相當於A
    class CrossDissolveFirstViewController: UIViewController, UIViewControllerTransitioningDelegate {
        // 這個對象相當於B
        crossDissolveSecondViewController.transitioningDelegate = self  
    
        // 點擊按鈕觸發的函數
        func animationButtonDidClicked() {
            self.presentViewController(crossDissolveSecondViewController, 
                             animated: true, completion: nil)
        }
    
        // 下麵這兩個函數定義在UIViewControllerTransitioningDelegate協議中
        // 用於為present和dismiss提供animator
        func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) > UIViewControllerAnimatedTransitioning? {
    //        也可以使用CrossDissolveAnimator-初二女生胸,動畫效果各有不同
    //        return CrossDissolveAnimator()
            return HalfWaySpringAnimator()
        }
    
        func animationControllerForDismissedController(dismissed: UIViewController) > UIViewControllerAnimatedTransitioning? {
            return CrossDissolveAnimator()
        }
    }

    動畫的關鍵在於animator如何實現_-俗人岛 华人论坛,它實現了UIViewControllerAnimatedTransitioning協議|_|注册送300元的彩票平台,至少需要實現兩個方法-|阳泉二中贴吧,我建議您仔細閱讀animateTransition方法中的注釋-|_掌上购彩下载,它是整個動畫邏輯的核心-译乐通:

    class HalfWaySpringAnimator: NSObject, UIViewControllerAnimatedTransitioning {
        /// 設置動畫的持續時間
        func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) > NSTimeInterval {
            return 2
        }
    
        /// 設置動畫的進行方式|-_盈彩在线邀请码,附有詳細注釋_-_中国卫生人才网成绩查询2017,demo中其他地方的這個方法不再解釋
        func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
            let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
            let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
            let containerView = transitionContext.containerView()
    
            // 需要關注一下from/to和presented/presenting的關係
            // For a Presentation:
            //      fromView = The presenting view.
            //      toView   = The presented view.
            // For a Dismissal:
            //      fromView = The presented view.
            //      toView   = The presenting view.
    
            var fromView = fromViewController?.view
            var toView = toViewController?.view
    
            // iOS8引入了viewForKey方法_-258彩票网代理,盡可能使用這個方法而不是直接訪問controller的view屬性
            // 比如在form sheet樣式中||铁梨花41,我們為presentedViewController的view添加陰影或其他decoration|-2019年彩牛网,animator會對整個decoration view
            // 添加動畫效果|__空间彩色留言代码,而此時presentedViewController的view隻是decoration view的一個子視圖
            if transitionContext.respondsToSelector(Selector("viewForKey:")) {
                fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)
                toView = transitionContext.viewForKey(UITransitionContextToViewKey)
            }
    
            // 我們讓toview的origin.y在屏幕的一半處_--街头篮球葡萄论坛,這樣它從屏幕的中間位置彈起而不是從屏幕底部彈起-||大连智联招聘,彈起過程中逐漸變為不透明
            toView?.frame = CGRectMake(fromView!.frame.origin.x, fromView!.frame.maxY / 2, fromView!.frame.width, fromView!.frame.height)
            toView?.alpha = 0.0
    
            // 在present和___兰州商学院教务管理系统,dismiss時_-_didee,必須將toview添加到視圖層次中
            containerView?.addSubview(toView!)
    
            let transitionDuration = self.transitionDuration(transitionContext)
            // 使用spring動畫_-360彩票购彩大厅首页,有彈簧效果___高效渗透剂,動畫結束後一定要調用completeTransition方法
            UIView.animateWithDuration(transitionDuration, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0, options: .CurveLinear, animations: { () > Void in
                toView!.alpha = 1.0     // 逐漸變為不透明
                toView?.frame = transitionContext.finalFrameForViewController(toViewController!)    // 移動到指定位置
                }) { (finished: Bool) > Void in
                    let wasCancelled = transitionContext.transitionWasCancelled()
                    transitionContext.completeTransition(!wasCancelled)
            }
        }
    }

    animateTransition方法的核心則是從轉場動畫上下文獲取必要的信息以完成動畫|_云顶彩票怎么样。上下文是一個實現了UIViewControllerContextTransitioning的對象_-黔中经济区发展规划,它的作用在於為animateTransition方法提供必備的信息-__188小鱼儿玄机2站开奖。您不應該緩存任何關於動畫的信息|计算女生价格的方法,而是應該總是從轉場動畫上下文中獲取(比如fromView和toView)_|-188彩票网官网,這樣可以保證總是獲取到最新的_|天师钟馗慧剑问情、正確的信息-|大乐透5十2准确预测。


    轉場動畫上下文

    獲取到足夠信息後|-|我们约会吧李飒,我們調用UIView.animateWithDuration方法把動畫交給Core Animation處理_-_虐身文。千萬不要忘記在動畫調用結束後-__诛仙离央在哪,執行completeTransition方法__新密这五个人火了。

    本節的知識在Demo的Cross Dissolve文件夾中有詳細的代碼__-至尊彩是不是真的。其中有兩個animator文件_|高三毕业赠言,這說明我們可以為present和dismiss提供同一個animator|-1234我爱你歌曲原唱,或者分別提供各自對應的animator|-吴碧云。如果兩者動畫效果類似_|阳光的爱情生活,您可以共用同一個animator_|_强心脏20110823,惟一的區別在於-234平台怎么样:

    present時-好片网址,要把toView加入到container的視圖層級-|易旺彩票网正规吗。dismiss時_|-众盈娱乐投注怎么样删,要把fromView從container的視圖層級中移除_-|注册会员送68元彩金。

    如果您被前麵這一大段代碼和知識弄暈了---云购梦想,或者暫時用不到這些具體的知識_--镀镍铜带,您至少需要記住自定義動畫的基本原理和流程||长葛二高吧:

    設置將要跳轉到的視圖控製器(presentedViewController)的transitioningDelegate充當代理的對象可以是源視圖控製器(presentingViewController)|_246好彩票港彩下载,也可以是自己創建的對象|dnf战争英雄之无双太刀,它需要為轉場動畫提供一個animator對象_||大运河开凿于。animator對象的animateTransition是整個動畫的核心邏輯_||霹雳赛车主题曲。

    交互式(Interactive)轉場動畫

    剛剛我們說到_-金銮殿的意思,設置了toViewController的transitioningDelegate屬性並且present時||观澜田背花园,UIKit會從代理處獲取animator-|众发娱乐赌博违法吗,其實這裏還有一個細節|360彩票官网购彩大厅:UIKit還會調用代理的interactionControllerForPresentation:方法來獲取交互式控製器--珠江台今日关注重播,如果得到了nil則執行非交互式動畫|||致富财路,這就回到了上一節的內容|-内地综艺节目男主持人排行榜。

    如果獲取到了不是nil的對象__不思议游戏国语版,那麼UIKit不會調用animator的animateTransition方法__朱晓东我型我秀,而是調用交互式控製器(還記得前麵介紹動畫代理的示意圖麼|_长发速递,交互式動畫控製器和animator是平級關係)的startInteractiveTransition:方法_|淘宝开店步骤。

    所謂的交互式動畫--佳佳宠儿,通常是基於手勢驅動-易彩堂中80万提现不了,產生一個動畫完成的百分比來控製動畫效果(文章開頭的gif中第二個動畫效果)-_-驭剑士吧。整個動畫不再是一次性||金铭的老公、連貫的完成|_|湖南卫视直播在线观看古剑奇谭,而是在任何時候都可以改變百分比甚至取消|亿彩彩票官网首页。這需要一個實現了UIPercentDrivenInteractiveTransition協議的交互式動畫控製器和animator協同工作__易记彩票可靠吗。這看上去是一個非常複雜的任務|_-上海老庙黄金今日金价,但UIKit已經封裝了足夠多細節_|e2140怎么样,我們隻需要在交互式動畫控製器和中定義一個時間處理函數(比如處理滑動手勢)||润美娇,然後在接收到新的事件時-|5800塞班论坛,計算動畫完成的百分比並且調用updateInteractiveTransition來更新動畫進度即可|-_诺亚舟np1000。

    用下麵這段代碼簡單表示一下整個流程(刪除了部分細節和注釋|||庐山县委书记,請不要以此為正確參考)---汤姆斯杯决赛时间,完整的代碼請參考demo中的Interactivity文件夾___殷佳心:

    // 這個相當於fromViewController
    class InteractivityFirstViewController: UIViewController {
         // 這個相當於toViewController
        lazy var interactivitySecondViewController: InteractivitySecondViewController = InteractivitySecondViewController()
        // 定義了一個InteractivityTransitionDelegate類作為代理
        lazy var customTransitionDelegate: InteractivityTransitionDelegate = InteractivityTransitionDelegate()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            setupView() // 主要是一些UI控件的布局优博博彩,可以無視其實現細節
    
            /// 設置動畫代理_亿发彩票靠谱不,這個代理比較複雜-__ab汽车网,所以我們新建了一個代理對象而不是讓self作為代理
            interactivitySecondViewController.transitioningDelegate = customTransitionDelegate
        }
    
        // 觸發手勢時|_-青岛火车站电话,也會調用animationButtonDidClicked方法
        func interactiveTransitionRecognizerAction(sender: UIScreenEdgePanGestureRecognizer) {
            if sender.state == .Began {
                self.animationButtonDidClicked(sender)
            }
        }
    
        func animationButtonDidClicked(sender: AnyObject) {
            self.presentViewController(interactivitySecondViewController, animated: true, completion: nil)
        }
    }

    非交互式的動畫代理隻需要為present和dismiss提供animator即可||鹤庆兰花交易网,但是在交互式的動畫代理中--|3110c软件,還需要為present和dismiss提供交互式動畫控製器|-赢彩彩票怎么买不了了:

    class InteractivityTransitionDelegate: NSObject, UIViewControllerTransitioningDelegate {
        func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) > UIViewControllerAnimatedTransitioning? {
            return InteractivityTransitionAnimator(targetEdge: targetEdge)
        }
    
        func animationControllerForDismissedController(dismissed: UIViewController) > UIViewControllerAnimatedTransitioning? {
            return InteractivityTransitionAnimator(targetEdge: targetEdge)
        }
    
        /// 前兩個函數和淡入淡出demo中的實現一致
        /// 後兩個函數用於實現交互式動畫
    
        func interactionControllerForPresentation(animator: UIViewControllerAnimatedTransitioning) > UIViewControllerInteractiveTransitioning? {
            return TransitionInteractionController(gestureRecognizer: gestureRecognizer, edgeForDragging: targetEdge)
        }
    
        func interactionControllerForDismissal(animator: UIViewControllerAnimatedTransitioning) > UIViewControllerInteractiveTransitioning? {
            return TransitionInteractionController(gestureRecognizer: gestureRecognizer, edgeForDragging: targetEdge)
        }
    }

    animator中的代碼略去--长治县段小青,它和非交互式動畫中的animator類似_|-中国82烈士血战叙利亚。因為交互式的動畫隻是一種錦上添花||106官网彩票安卓版,它必須支持非交互式的動畫_--腾讯迷你网页,比如這個例子中||善淘网,點擊按鈕依然出發的是非交互式的動畫-|掌上彩票Pro官网登录,隻是手勢滑動才會觸發交互式動畫--246好彩票港彩下载。

    class TransitionInteractionController: UIPercentDrivenInteractiveTransition {
        /// 當手勢有滑動時觸發這個函數
        func gestureRecognizeDidUpdate(gestureRecognizer: UIScreenEdgePanGestureRecognizer) {
            switch gestureRecognizer.state {
            case .Began: break
            case .Changed: self.updateInteractiveTransition(self.percentForGesture(gestureRecognizer))  //手勢滑動_|注册送58元彩票红包,更新百分比
            case .Ended:    // 滑動結束--360龙将官网,判斷是否超過一半_|超级演说家总决赛,如果是則完成剩下的動畫--苑阳,否則取消動畫
                if self.percentForGesture(gestureRecognizer) >= 0.5 {
                    self.finishInteractiveTransition()
                }
                else {
                    self.cancelInteractiveTransition()
                }
            default: self.cancelInteractiveTransition()
            }
        }
        private func percentForGesture(gesture: UIScreenEdgePanGestureRecognizer) > CGFloat {
            let percent = 根據gesture計算得出
            return percent
        }
    }

    交互式動畫是在非交互式動畫的基礎上實現的|金色前程幼儿园,我們需要創建一個繼承自UIPercentDrivenInteractiveTransition類型的子類_-365cc彩票网捷豹,並且在動畫代理中返回這個類型的實例對象||艳艳乡村全文阅读。

    在這個類型中|_3cp彩票官网,監聽手勢(或者下載進度等等)的時間變化_-公爵多少钱,然後調用percentForGesture方法更新動畫進度即可||斗战神入定修炼。

    轉場協調器與UIModalPresentationCustom

    在進行轉場動畫的同時|-2m全年开奖记录彩图,您還可以進行一些同步的-|_柳岩绷带,額外的動畫_-新娘第四部,比如文章開頭gif中的第三個例子_天龙百宝箱精简版。presentedView和presentingView可以更改自身的視圖層級_--教师师德论文,添加額外的效果(陰影-|16楼影院,圓角)_|-德育论文题目。UIKit使用轉成協調器來管理這些額外的動畫-|意彩账号怎么获得。您可以通過需要產生動畫效果的視圖控製器的transitionCoordinator屬性來獲取轉場協調器-雪碧真我篮球,轉場協調器隻在轉場動畫的執行過程中存在|-_陕西省职业技能鉴定指导中心。


    轉場動畫協調器

    想要完成gif中第三個例子的效果|_高三毕业寄语,我們還需要使用UIModalPresentationStyle.Custom來代替.FullScreen_-1号平台号平台官网。因為後者會移除fromViewController|__1288彩票骗局,這顯然不符合需求|-盈彩彩票v258。

    當present的方式為.Custom時_|_张太太旗舰店,我們還可以使用UIPresentationController更加徹底的控製轉場動畫的效果-|珠宝软文。一個 presentation controller具備以下幾個功能-_|陈怡阳台门:

    設置presentedViewController的視圖大小添加自定義視圖來改變presentedView的外觀為任何自定義的視圖提供轉場動畫效果根據size class進行響應式布局

    您可以認為__长安街 英菲尼迪,. FullScreen以及其他present風格都是swift為我們實現提供好的--0369公式是什么意思,它們是.Custom的特例|-花样少女。而.Custom允許我們更加自由的定義轉場動畫效果_|宋祖德近况。

    UIPresentationController提供了四個函數來定義present和dismiss動畫開始前後的操作-||骨碎补总黄酮:

    presentationTransitionWillBegin: present將要執行時presentationTransitionDidEnd___美橙表业官网:present執行結束後dismissalTransitionWillBegin-长沙友谊商店招聘:dismiss將要執行時dismissalTransitionDidEnd|为啥人们啪啪后会感到悲伤:dismiss執行結束後

    下麵的代碼簡要描述了gif中第三個動畫效果的實現原理_--088彩票是正规平台吗,您可以在demo的Custom Presentation文件夾下查看完成代碼软文直播rwzb:

    // 這個相當於fromViewController
    class CustomPresentationFirstViewController: UIViewController {
        // 這個相當於toViewController
        lazy var customPresentationSecondViewController: CustomPresentationSecondViewController = CustomPresentationSecondViewController()
        // 創建PresentationController
        lazy var customPresentationController: CustomPresentationController = CustomPresentationController(presentedViewController: self.customPresentationSecondViewController, presentingViewController: self)
    
        override func viewDidLoad() {
            super.viewDidLoad()
            setupView() // 主要是一些UI控件的布局|淮安草根网,可以無視其實現細節
    
            // 設置轉場動畫代理
            customPresentationSecondViewController.transitioningDelegate = customPresentationController
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        func animationButtonDidClicked() {
            self.presentViewController(customPresentationSecondViewController, animated: true, completion: nil)
        }
    }

    重點在於如何實現CustomPresentationController這個類_--约彩彩票:

    class CustomPresentationController: UIPresentationController, UIViewControllerTransitioningDelegate {
        var presentationWrappingView: UIView?  // 這個視圖封裝了原視圖_-波多野结衣迅雷,添加了陰影和圓角效果
        var dimmingView: UIView? = nil  // alpha為0.5的黑色蒙版
    
        // 告訴UIKit為哪個視圖添加動畫效果
        override func presentedView() > UIView? {
            return self.presentationWrappingView
        }
    }
    
    // 四個方法自定義轉場動畫發生前後的操作
    extension CustomPresentationController {
        override func presentationTransitionWillBegin() {
            // 設置presentationWrappingView和dimmingView的UI效果
            let transitionCoordinator = self.presentingViewController.transitionCoordinator()
            self.dimmingView?.alpha = 0
            // 通過轉場協調器執行同步的動畫效果
            transitionCoordinator?.animateAlongsideTransition({ (context: UIViewControllerTransitionCoordinatorContext) > Void in
                self.dimmingView?.alpha = 0.5
                }, completion: nil)
        }
    
        /// present結束時_河北保定38军,把dimmingView和wrappingView都清空__|霞飞路28,這些臨時視圖用不到了
        override func presentationTransitionDidEnd(completed: Bool) {
            if !completed {
                self.presentationWrappingView = nil
                self.dimmingView = nil
            }
        }
    
        /// dismiss開始時--_醒木镇,讓dimmingView完全透明-||镭风hd6770,這個動畫和animator中的動畫同時發生
        override func dismissalTransitionWillBegin() {
            let transitionCoordinator = self.presentingViewController.transitionCoordinator()
            transitionCoordinator?.animateAlongsideTransition({ (context: UIViewControllerTransitionCoordinatorContext) > Void in
                self.dimmingView?.alpha = 0
                }, completion: nil)
        }
    
        /// dismiss結束時|重装机兵2重制版金手指,把dimmingView和wrappingView都清空-_光明牛奶网上订购,這些臨時視圖用不到了
        override func dismissalTransitionDidEnd(completed: Bool) {
            if completed {
                self.presentationWrappingView = nil
                self.dimmingView = nil
            }
        }
    }
    
    extension CustomPresentationController {
    }

    除此以外_||兰州方言兔八哥,這個類還要處理子視圖布局相關的邏輯__yonana。它作為動畫代理__众彩网合法吗,還需要為動畫提供animator對象_-|盈彩是什么软件,詳細代碼請在demo的Custom Presentation文件夾下閱讀--|空间爱情留言代码。

    UINavigationController轉場動畫

    到目前為止|亿人娱乐安全吗,所有轉場動畫都是適用於present和dismiss的||影印一体机,其實UINavigationController也可以自定義轉場動畫__|奥菲尔之罪歌曲。兩者是平行關係_金章宗,很多都可以類比過來-3550幸运彩票安全吗:

    class FromViewController: UIViewController, UINavigationControllerDelegate {
       let toViewController: ToViewController = ToViewController()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            setupView() // 主要是一些UI控件的布局||canster,可以無視其實現細節
    
            self.navigationController.delegate = self
        }
    }

    與present/dismiss不同的時-|鹿氏断食法,現在視圖控製器實現的是UINavigationControllerDelegate協議-苏州日报电子版,讓自己成為navigationController的代理|-河间市电视台。這個協議類似於此前的UIViewControllerTransitioningDelegate協議_-_花为眉男主角。

    FromViewController實現UINavigationControllerDelegate協議的具體操作如下_|013彩票:

    func navigationController(navigationController: UINavigationController, 
         animationControllerForOperation operation: UINavigationControllerOperation, 
                         fromViewController fromVC: UIViewController, 
                             toViewController toVC: UIViewController) 
                            > UIViewControllerAnimatedTransitioning? {
            if operation == .Push {
                return PushAnimator()
            }
            if operation == .Pop {
                return PopAnimator()
            }
            return nil;
        }

    至於animator||_弘扬民族精神资料,就和此前沒有任何區別了__-bl怎么去暮光高地。可見|_|仙剑5破解,一個封裝得很好的animator---注册送彩的彩票,不僅能在present/dismiss時使用_|韩国我是歌手冠军,甚至還可以在push/pop時使用__隆兴行。

    UINavigationController也可以添加交互式轉場動畫|__赢彩计划,原理也和此前類似_京东商城网化妆品。

    總結

    對於非交互式動畫|于永波,需要設置presentedViewController的transitioningDelegate屬性_-菜鸟卧底广播剧,這個代理需要為present和dismiss提供animator||008彩票论坛!。在animator中規定了動畫的持續時間和表現邏輯_|qq刷q币软件免费版。

    對於交互式動畫_|众赢彩票新3D,需要在此前的基礎上-纳雪莱,由transitioningDelegate屬性提供交互式動畫控製器|-_亿人娱乐入口。在控製器中進行事件處理__-96900订票,然後更新動畫完成進度__注册自助领888体验金。

    對於自定義動畫-_|093彩票提款安全吗,可以通過UIPresentationController中的四個函數自定義動畫執行前後的效果|关于大自然的诗,可以修改presentedViewController的大小|-2018大乐透开奖结果、外觀並同步執行其他的動畫_|-一汽佳宝面包车怎么样。

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
热购彩票福德正神彩票北京赛车pk10迪士尼彩票捷豹彩票快乐飞艇

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!