在iOS7以前,開發者如果希望定制導航控制器推入推出視圖時的轉場動畫,一般都只能通過子類化UINavigationController或者自己編寫動畫代碼去覆蓋相應的方法,現在iOS7為開發者帶來了福音,蘋果公司引入了大量新API,給予了開發者很高的自由度,在處理由UIViewController管理的UIView動畫時,這些API使用方便,可擴展性也很強,定制起來非常輕松:
全新的針對UIView的動畫block方法
iOS4的發布帶來了強大的block方法,在編寫UIView動畫時使用block可以輕松地得到滿意的效果,然而有些情況下,我們還是不得不直接使用Core Animation。幸運的是,蘋果公司在iOS7中增加了2個新的基于block的方法,這樣我們就很少再需要直接使用Core Animation了。
1、關鍵幀動畫
iOS7為UIView封裝了一組API,讓我們很容易的得到與Core Animation框架中的CAKeyframeAnimation一樣的效果。
[UIView animateKeyframesWithDuration:duration delay:delay options:options animations:^{ [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 animations:^{ //第一幀要執行的動畫 }]; [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.5 animations:^{ //第二幀要執行的動畫 }]; } completion:^(BOOL finished) { //動畫結束后執行的代碼塊 }];
新引入的animateKeyframesWithDuration與CAKeyframeAnimation的關系,可以比對animateWithDuration和CABasicAnimation,我們只需要將每一幀動畫加入到block方法中,并傳入此段動畫在全過程中的相對開始時間和執行時間(duration具體是指此段動畫的執行時間占全過程的百分比)。同時,你可以在一次動畫中使用多個關鍵幀,只需使用addKeyframe依次將所有關鍵幀加入動畫執行棧中。
下面是一個簡單的例子:在示例應用中,我使用關鍵幀block來退出模態視圖控制器。
[UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.15 animations:^{ //順時針旋轉90度 snapshot.transform = CGAffineTransformMakeRotation(M_PI * -1.5); }]; [UIView addKeyframeWithRelativeStartTime:0.15 relativeDuration:0.10 animations:^{ //180度 snapshot.transform = CGAffineTransformMakeRotation(M_PI * 1.0); }]; [UIView addKeyframeWithRelativeStartTime:0.25 relativeDuration:0.20 animations:^{ //擺過中點,225度 snapshot.transform = CGAffineTransformMakeRotation(M_PI * 1.3); }]; [UIView addKeyframeWithRelativeStartTime:0.45 relativeDuration:0.20 animations:^{ //再擺回來,140度 snapshot.transform = CGAffineTransformMakeRotation(M_PI * 0.8); }]; [UIView addKeyframeWithRelativeStartTime:0.65 relativeDuration:0.35 animations:^{ //旋轉后掉落 //最后一步,視圖淡出并消失 CGAffineTransform shift = CGAffineTransformMakeTranslation(180.0, 0.0); CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI * 0.3); snapshot.transform = CGAffineTransformConcat(shift, rotate); _coverView.alpha = 0.0; }];
視圖仿佛在重力的牽引下繞左下角順時針旋轉,并在最低點擺動了一下,最后脫落。
2、彈簧動畫
iOS7新引入的另一個block方法可以讓你輕松將真實物理世界中的彈性效果集成進視圖動畫中。蘋果公司一直建議開發者盡可能將動畫效果做的跟真實物理世界一樣――在視圖滑動時,可以像彈簧一樣,稍微拉伸一些,再彈回正確位置。使用新的彈簧動畫API來實現此效果相較以往要簡單很多。
[UIView animateWithDuration:duration delay:delay usingSpringWithDamping:damping initialSpringVelocity:velocity options:options animations:^{ //這里書寫動畫相關代碼 } completion:^(BOOL finished) { //動畫結束后執行的代碼塊 }];
這里用到了一些物理上的概念:damping參數代表彈性阻尼,隨著阻尼值越來越接近0.0,動畫的彈性效果會越來越明顯,而如果設置阻尼值為1.0,則視圖動畫不會有彈性效果――視圖滑動時會直接減速到0并立刻停止,不會有彈簧類的拉伸效果。
velocity參數代表彈性修正速度,它表示視圖在彈跳時恢復原位的速度,例如,如果在動畫中視圖被拉伸的最大距離是200像素,你想讓視圖以100像素每秒的速度恢復原位,那么就設置velocity的值為0.5。(譯者:建議大家看看源代碼,代碼中damping設置為0.8不夠明顯,你可以將damping調為0.1,然后慢慢調整velocity看看效果)
在示例應用程序中,我用彈簧動畫讓模態視圖控制器從屏幕底部滑上來,設置彈性阻尼為0.8,彈性修正速度為1.0,運行后可以看到,視圖將沖出15像素的距離,然后慢慢降回原位。如果我設置彈性阻尼為0.6或者更小,那么視圖會沖得更高,而且降回原位前還會繼續向下反彈。(也就是停止前來回彈的次數越來越多,彈性效果越來越明顯)需要注意的是,不要將彈性動畫與UIKit的動態特效引擎相混淆。彈性動畫是一個標準的UIView動畫API,僅僅提供了有限的幾種真實物理效果。
自定義UIViewController的轉場動畫
現在讓我們來看一個好東西。蘋果公司不僅為開發者引入了新的動畫API,而且還擴大了其應用范圍。在使用UIViewController管理視圖的推入推出時,可以很容易地自定義以下轉場動畫:
• UIViewController
• presentViewController
• UITabBarController
• setSelectedViewController
• setSelectedIndex
• UINavigationController
• pushViewController
• popViewController
• setViewControllers
在示例應用程序中,我創建了一系列轉場動畫,在動畫中使用了之前講解過的新引入的彈簧動畫和關鍵幀block方法,現在讓我們來看看如何使用新API來自定義上述的轉場動畫。
1、核心概念:動畫控制器
那么,如何在使用自定義動畫的同時不影響視圖的其他屬性?對此蘋果公司提供了一個新的協議:UIViewControllerAnimatedTransitioning,我們可以在協議方法中編寫自定義的動畫代碼。蘋果開發者文檔中稱實現了此協議的對象為動畫控制器。
由于我們使用了協議這一語法特性,自定義動畫的代碼可以靈活的放在自己想要的位置。你可以創建一個專門用于管理動畫的類, 也可以讓UIViewController實現UIViewControllerAnimatedTransitioning接口。由于需要實現一系列不同的動畫,因此選擇為每個動畫創建一個類。接下來創建這些動畫類的通用父類――BaseAnimation,它定義了一些通用的屬性和助手方法。
讓我們來看第一個動畫,使用UINavigationController推入推出視圖時,會有一個簡單的縮放效果。
-(void)animateTransition: (id)transitionContext { //獲取容器視圖引用 UIView *containerView = [transitionContext containerView]; UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey ]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; if (self.type == AnimationTypePresent) { //插入“to”視圖,初始縮放值為0.0 toViewController.view.transform = CGAffineTransformMakeScale(0.0, 0.0); [containerView insertSubview:toViewController.view aboveSubview:fromViewController.view]; //縮放“to”視圖為想要的效果 [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{ toViewController.view.transform = CGAffineTransformMakeScale(1.0, 1.0); } completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; } else if (self.type == AnimationTypeDismiss) { //插入“to”視圖 [containerView insertSubview:toViewController.view belowSubview:fromViewController.view]; //縮小“from”視圖,直到其消失 [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{ fromViewController.view.transform = CGAffineTransformMakeScale(0.0, 0.0); } completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; } } -(NSTimeInterval)transitionDuration: (id)transitionContext { return 0.4; }
符合UIViewControllerAnimatedTransitioning協議的任何對象都需要實現animateTransition:和transitionDuration:兩個方法。你也可以選擇實現@optional方法animationEnded:,它在動畫完成后由系統自動調用,相當于completion block,非常方便。
在animateTransition:中你需要處理以下過程:
1. 將“to”視圖插入容器視圖
2. 將“to”和“from”視圖分別移動到自己想要的位置
3. 最后,在動畫完成時千萬別忘了調用completeTransition: 方法
UIViewControllerAnimatedTransitioning協議中的方法都帶有一個參數:transitionContext,這是一個系統級的對象,它符合 UIView-ControllerContextTransitioning協議,我們可以從該對象中獲取用于控制轉場動畫的必要信息,主要包括以下內容:
顯然,蘋果公司幫助開發者完成了大部分讓人討厭的細節工作,僅僅需要我們自己完成的工作就是定義動畫的初始狀態和終止狀態,并調整到自己滿意的效果。最后我再亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕国产精品| 精品国产依人香蕉在线精品| 国产午夜精品美女视频明星a级| 美女视频黄免费的亚洲男人天堂| 久久97久久97精品免视看| 草民午夜欧美限制a级福利片| 在线国产精品视频| 精品夜色国产国偷在线| 国产精品扒开腿做| 精品中文字幕在线| 尤物yw午夜国产精品视频| 国产丝袜精品第一页| 日本精品视频网站| 欧美日韩福利电影| 日韩大片免费观看视频播放| 欧美尤物巨大精品爽| 中文字幕日韩欧美在线视频| 久久国产精品久久久久久| 丝袜亚洲另类欧美重口| 亚洲xxxxx性| 欧美性jizz18性欧美| 日韩一级裸体免费视频| 综合136福利视频在线| 九九精品在线视频| 亚洲一区二区三区视频播放| 国产91亚洲精品| 日本成人激情视频| 国产日韩av在线播放| 日韩欧美在线视频观看| 欧美性猛交xxxx黑人猛交| 91影院在线免费观看视频| 91国产美女视频| 韩国福利视频一区| 欧美午夜视频在线观看| 97在线视频国产| 国产精品精品一区二区三区午夜版| 欧美在线视频播放| 久久6免费高清热精品| 性金发美女69hd大尺寸| 中文字幕日韩在线观看| 国产精品久久久久久久久久尿| 92福利视频午夜1000合集在线观看| 亚洲xxxx3d| 久久久人成影片一区二区三区| 欧美在线观看网址综合| 精品在线小视频| 红桃av永久久久| 国产中文字幕亚洲| 欧美夫妻性视频| 日韩小视频在线| 欧美一级淫片videoshd| 亚洲成人aaa| 91精品视频免费| 国产精品第一第二| 国产精品日日摸夜夜添夜夜av| 国产精品免费观看在线| 午夜精品视频在线| 亚洲最新视频在线| 日产精品久久久一区二区福利| 久久夜精品香蕉| 国产精品av在线| 国产亚洲精品激情久久| 国产一区二区精品丝袜| 日韩av影片在线观看| 日韩av在线免费| 欧美成年人视频| 成人免费观看49www在线观看| 亚洲欧美日韩中文在线制服| 欧美洲成人男女午夜视频| 国产精品视频久久久久| 亚洲综合中文字幕在线观看| 成人伊人精品色xxxx视频| 亚洲女人初尝黑人巨大| 国产一区二区精品丝袜| 久久久久久久久久婷婷| 久久久视频免费观看| 91精品国产高清久久久久久| 日韩一区二区欧美| 亚洲精品电影网| 国产精品 欧美在线| 亚洲第一页自拍| 97精品在线观看| 国产精品欧美久久久| 亚洲欧美中文日韩v在线观看| 久久精品夜夜夜夜夜久久| 久久欧美在线电影| 亚洲欧美综合另类中字| 久久精品国产一区| 欧美大片在线影院| 国产欧美最新羞羞视频在线观看| 高清欧美性猛交xxxx| 亚洲一品av免费观看| 国产成人啪精品视频免费网| 中文字幕最新精品| 国产欧美精品久久久| 久久久在线观看| 久久久久久久久久av| 北条麻妃一区二区三区中文字幕| 欧美专区国产专区| 欧美日韩精品在线| 一本色道久久88亚洲综合88| 在线视频日韩精品| 国产成人欧美在线观看| 日韩在线播放视频| 日韩电影免费在线观看中文字幕| 日韩在线观看免费全集电视剧网站| 一本色道久久88精品综合| 亚洲第一av在线| 国产日韩欧美中文| 亚洲第一视频网站| 亚洲一区二区三区视频| 粉嫩老牛aⅴ一区二区三区| 亚洲成人网在线| 欧美老女人性视频| 久久久久久久久综合| 亚洲国产欧美自拍| 欧美xxxx做受欧美| 91国自产精品中文字幕亚洲| 91国产视频在线播放| 日韩欧美成人网| 欧美午夜精品在线| 在线视频欧美日韩| 精品国产拍在线观看| 日韩亚洲在线观看| 久久天天躁狠狠躁夜夜躁| 欧美最猛黑人xxxx黑人猛叫黄| 欧美日本精品在线| 日韩福利在线播放| 亚洲欧美日韩另类| 欧美午夜无遮挡| 国产视频一区在线| 97婷婷涩涩精品一区| 亚洲日本欧美中文幕| 国产成人精品综合久久久| 日韩精品在线观看一区二区| 亚洲一级黄色片| 欧美肥老太性生活视频| 成人高清视频观看www| 色诱女教师一区二区三区| 久久精品国产亚洲7777| 日韩欧美在线观看视频| 色爱精品视频一区| 日韩综合视频在线观看| 色yeye香蕉凹凸一区二区av| 欧美激情精品久久久久| 在线精品播放av| 国产精品电影观看| 久热国产精品视频| 日韩大胆人体377p| 久久6免费高清热精品| 日韩国产高清污视频在线观看| 欧美一级高清免费播放| 亚洲国产欧美一区二区三区久久| 亚洲国产精品免费| 久久免费国产精品1| 日韩免费在线免费观看| 亚洲午夜久久久久久久| 国内精品小视频在线观看| 色综合伊人色综合网站| 欧美在线一区二区三区四| 国产精品视频午夜| 26uuu久久噜噜噜噜| 国产精品人人做人人爽| 一本一本久久a久久精品牛牛影视|