欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入學(xué)習(xí)iOS7自定義導(dǎo)航轉(zhuǎn)場(chǎng)動(dòng)畫

 更新時(shí)間:2016年02月14日 15:46:00   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了iOS7自定義導(dǎo)航轉(zhuǎn)場(chǎng)動(dòng)畫的相關(guān)資料,感興趣的小伙伴們可以參考一下

在iOS7以前,開發(fā)者如果希望定制導(dǎo)航控制器推入推出視圖時(shí)的轉(zhuǎn)場(chǎng)動(dòng)畫,一般都只能通過子類化UINavigationController或者自己編寫動(dòng)畫代碼去覆蓋相應(yīng)的方法,現(xiàn)在iOS7為開發(fā)者帶來了福音,蘋果公司引入了大量新API,給予了開發(fā)者很高的自由度,在處理由UIViewController管理的UIView動(dòng)畫時(shí),這些API使用方便,可擴(kuò)展性也很強(qiáng),定制起來非常輕松: 

  • 全新的針對(duì)UIView的動(dòng)畫block方法
  • 全新的UIViewControllerAnimatedTransitioning協(xié)議以及動(dòng)畫控制器的概念
  • Interaction Controllers以及Transition Coordinators
  • 全新的針對(duì)動(dòng)畫的助手API(簡(jiǎn)便方法)

全新的針對(duì)UIView的動(dòng)畫block方法
iOS4的發(fā)布帶來了強(qiáng)大的block方法,在編寫UIView動(dòng)畫時(shí)使用block可以輕松地得到滿意的效果,然而有些情況下,我們還是不得不直接使用Core Animation。幸運(yùn)的是,蘋果公司在iOS7中增加了2個(gè)新的基于block的方法,這樣我們就很少再需要直接使用Core Animation了。
1、關(guān)鍵幀動(dòng)畫
iOS7為UIView封裝了一組API,讓我們很容易的得到與Core Animation框架中的CAKeyframeAnimation一樣的效果。

 [UIView animateKeyframesWithDuration:duration delay:delay 
options:options animations:^{ 
[UIView addKeyframeWithRelativeStartTime:0.0 
relativeDuration:0.5 animations:^{ 
//第一幀要執(zhí)行的動(dòng)畫 
}]; 
[UIView addKeyframeWithRelativeStartTime:0.5 
relativeDuration:0.5 animations:^{ 
//第二幀要執(zhí)行的動(dòng)畫 
}]; 
} completion:^(BOOL finished) { 
//動(dòng)畫結(jié)束后執(zhí)行的代碼塊 
}]; 

新引入的animateKeyframesWithDuration與CAKeyframeAnimation的關(guān)系,可以比對(duì)animateWithDuration和CABasicAnimation,我們只需要將每一幀動(dòng)畫加入到block方法中,并傳入此段動(dòng)畫在全過程中的相對(duì)開始時(shí)間和執(zhí)行時(shí)間(duration具體是指此段動(dòng)畫的執(zhí)行時(shí)間占全過程的百分比)。同時(shí),你可以在一次動(dòng)畫中使用多個(gè)關(guān)鍵幀,只需使用addKeyframe依次將所有關(guān)鍵幀加入動(dòng)畫執(zhí)行棧中。 

下面是一個(gè)簡(jiǎn)單的例子:在示例應(yīng)用中,我使用關(guān)鍵幀block來退出模態(tài)視圖控制器。

[UIView addKeyframeWithRelativeStartTime:0.0 
relativeDuration:0.15 animations:^{ 
//順時(shí)針旋轉(zhuǎn)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:^{ 
//擺過中點(diǎn),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:^{ 
//旋轉(zhuǎn)后掉落 
//最后一步,視圖淡出并消失 
CGAffineTransform shift = 
CGAffineTransformMakeTranslation(180.0, 0.0); 
CGAffineTransform rotate = 
CGAffineTransformMakeRotation(M_PI * 0.3); 
snapshot.transform = CGAffineTransformConcat(shift, 
rotate); 
_coverView.alpha = 0.0; 
}]; 

視圖仿佛在重力的牽引下繞左下角順時(shí)針旋轉(zhuǎn),并在最低點(diǎn)擺動(dòng)了一下,最后脫落。 

2、彈簧動(dòng)畫
iOS7新引入的另一個(gè)block方法可以讓你輕松將真實(shí)物理世界中的彈性效果集成進(jìn)視圖動(dòng)畫中。蘋果公司一直建議開發(fā)者盡可能將動(dòng)畫效果做的跟真實(shí)物理世界一樣——在視圖滑動(dòng)時(shí),可以像彈簧一樣,稍微拉伸一些,再?gòu)椈卣_位置。使用新的彈簧動(dòng)畫API來實(shí)現(xiàn)此效果相較以往要簡(jiǎn)單很多。 

[UIView animateWithDuration:duration delay:delay 
usingSpringWithDamping:damping initialSpringVelocity:velocity 
options:options animations:^{ 
//這里書寫動(dòng)畫相關(guān)代碼 
} completion:^(BOOL finished) { 
//動(dòng)畫結(jié)束后執(zhí)行的代碼塊 
}]; 

這里用到了一些物理上的概念:damping參數(shù)代表彈性阻尼,隨著阻尼值越來越接近0.0,動(dòng)畫的彈性效果會(huì)越來越明顯,而如果設(shè)置阻尼值為1.0,則視圖動(dòng)畫不會(huì)有彈性效果——視圖滑動(dòng)時(shí)會(huì)直接減速到0并立刻停止,不會(huì)有彈簧類的拉伸效果。 

velocity參數(shù)代表彈性修正速度,它表示視圖在彈跳時(shí)恢復(fù)原位的速度,例如,如果在動(dòng)畫中視圖被拉伸的最大距離是200像素,你想讓視圖以100像素每秒的速度恢復(fù)原位,那么就設(shè)置velocity的值為0.5。(譯者:建議大家看看源代碼,代碼中damping設(shè)置為0.8不夠明顯,你可以將damping調(diào)為0.1,然后慢慢調(diào)整velocity看看效果) 

在示例應(yīng)用程序中,我用彈簧動(dòng)畫讓模態(tài)視圖控制器從屏幕底部滑上來,設(shè)置彈性阻尼為0.8,彈性修正速度為1.0,運(yùn)行后可以看到,視圖將沖出15像素的距離,然后慢慢降回原位。如果我設(shè)置彈性阻尼為0.6或者更小,那么視圖會(huì)沖得更高,而且降回原位前還會(huì)繼續(xù)向下反彈。(也就是停止前來回彈的次數(shù)越來越多,彈性效果越來越明顯)需要注意的是,不要將彈性動(dòng)畫與UIKit的動(dòng)態(tài)特效引擎相混淆。彈性動(dòng)畫是一個(gè)標(biāo)準(zhǔn)的UIView動(dòng)畫API,僅僅提供了有限的幾種真實(shí)物理效果。 

自定義UIViewController的轉(zhuǎn)場(chǎng)動(dòng)畫
現(xiàn)在讓我們來看一個(gè)好東西。蘋果公司不僅為開發(fā)者引入了新的動(dòng)畫API,而且還擴(kuò)大了其應(yīng)用范圍。在使用UIViewController管理視圖的推入推出時(shí),可以很容易地自定義以下轉(zhuǎn)場(chǎng)動(dòng)畫:

• UIViewController
• presentViewController
• UITabBarController
• setSelectedViewController
• setSelectedIndex
• UINavigationController
• pushViewController
• popViewController
• setViewControllers 

在示例應(yīng)用程序中,我創(chuàng)建了一系列轉(zhuǎn)場(chǎng)動(dòng)畫,在動(dòng)畫中使用了之前講解過的新引入的彈簧動(dòng)畫和關(guān)鍵幀block方法,現(xiàn)在讓我們來看看如何使用新API來自定義上述的轉(zhuǎn)場(chǎng)動(dòng)畫。
1、核心概念:動(dòng)畫控制器
那么,如何在使用自定義動(dòng)畫的同時(shí)不影響視圖的其他屬性?對(duì)此蘋果公司提供了一個(gè)新的協(xié)議:UIViewControllerAnimatedTransitioning,我們可以在協(xié)議方法中編寫自定義的動(dòng)畫代碼。蘋果開發(fā)者文檔中稱實(shí)現(xiàn)了此協(xié)議的對(duì)象為動(dòng)畫控制器。 
由于我們使用了協(xié)議這一語法特性,自定義動(dòng)畫的代碼可以靈活的放在自己想要的位置。你可以創(chuàng)建一個(gè)專門用于管理動(dòng)畫的類, 也可以讓UIViewController實(shí)現(xiàn)UIViewControllerAnimatedTransitioning接口。由于需要實(shí)現(xiàn)一系列不同的動(dòng)畫,因此選擇為每個(gè)動(dòng)畫創(chuàng)建一個(gè)類。接下來創(chuàng)建這些動(dòng)畫類的通用父類——BaseAnimation,它定義了一些通用的屬性和助手方法。
讓我們來看第一個(gè)動(dòng)畫,使用UINavigationController推入推出視圖時(shí),會(huì)有一個(gè)簡(jiǎn)單的縮放效果。

-(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協(xié)議的任何對(duì)象都需要實(shí)現(xiàn)animateTransition:和transitionDuration:兩個(gè)方法。你也可以選擇實(shí)現(xiàn)@optional方法animationEnded:,它在動(dòng)畫完成后由系統(tǒng)自動(dòng)調(diào)用,相當(dāng)于completion block,非常方便。
 在animateTransition:中你需要處理以下過程:
1. 將“to”視圖插入容器視圖
2. 將“to”和“from”視圖分別移動(dòng)到自己想要的位置
3. 最后,在動(dòng)畫完成時(shí)千萬別忘了調(diào)用completeTransition: 方法
UIViewControllerAnimatedTransitioning協(xié)議中的方法都帶有一個(gè)參數(shù):transitionContext,這是一個(gè)系統(tǒng)級(jí)的對(duì)象,它符合 UIView-ControllerContextTransitioning協(xié)議,我們可以從該對(duì)象中獲取用于控制轉(zhuǎn)場(chǎng)動(dòng)畫的必要信息,主要包括以下內(nèi)容:

 顯然,蘋果公司幫助開發(fā)者完成了大部分讓人討厭的細(xì)節(jié)工作,僅僅需要我們自己完成的工作就是定義動(dòng)畫的初始狀態(tài)和終止?fàn)顟B(tài),并調(diào)整到自己滿意的效果。最后我再啰嗦兩句有關(guān)transitionContext的重要注意事項(xiàng): 

1.獲取frame的方法可能會(huì)返回CGRectZero——如果系統(tǒng)無法確定該frame的值具體是什么。例如,如果你使用自定義的模態(tài)視圖控制器
推出動(dòng)畫,在結(jié)束時(shí)系統(tǒng)無法確定其finalFrame。
2.如果視圖控制器已經(jīng)從屏幕上移除了,那么獲取frame的方法也會(huì)返回CGRectZero。例如在導(dǎo)航控制器的轉(zhuǎn)場(chǎng)動(dòng)畫結(jié)束后,試圖獲取“from”視圖的finalFrame。
你不用手動(dòng)去移除“from”視圖,transitionContext將自動(dòng)幫你完成。
3.如果你在應(yīng)用的其他地方需要使用transitionContext,你可以放心地使用動(dòng)畫控制器保留一個(gè)transitionContext的引用。
將動(dòng)畫控制器應(yīng)用到轉(zhuǎn)場(chǎng)動(dòng)畫中。 

現(xiàn)在,我們已經(jīng)開發(fā)好了動(dòng)畫控制器,那么最后需要做的就是,將它們應(yīng)用到轉(zhuǎn)場(chǎng)動(dòng)畫中:我們需要對(duì)管理轉(zhuǎn)場(chǎng)動(dòng)畫的UIViewController做一些操作。 

一般來說,我們只需要讓UIViewController符合UIViewController-TransitioningDelegate 協(xié)議, 編寫animationController-ForPresentedController和animationControllerForDismissedController方法。在我的示例應(yīng)用程序中,我設(shè)置了一個(gè)屬性,用來讓動(dòng)畫控制器知道目前正在推入還是推出視圖:

 -(id) 
animationControllerForPresentedController:(UIViewController 
*)presented presentingController:(UIViewController 
*)presenting sourceController:(UIViewController *)source { 
modalAnimationController.type = AnimationTypePresent; 
return modalAnimationController; 
} 
-(id) 
animationControllerForDismissedController:(UIViewController 
*)dismissed { 
modalAnimationController.type = AnimationTypeDismiss; 
return modalAnimationController; 
} 

 然后,在推入模態(tài)視圖控制器時(shí),我們?cè)O(shè)置modalPresentationStyle為UIModalPresentationFullScreen或UIModalPresentationCustom。我們還必須將一個(gè)符合UIViewControllerTransitioningDelegate協(xié)議的對(duì)象設(shè)置為它的transitioningDelegate,一般來說都是推入該模態(tài)視圖控制器的UIViewController。 

OptionsViewController *modal = [[OptionsViewController alloc] 
initWithNibName:@"OptionsViewController" bundle:[NSBundle 
mainBundle]]; 
modal.transitioningDelegate = self; 
modal.modalPresentationStyle = UIModalPresentationCustom; 
[self presentViewController:modal animated:YES 
completion:nil]; 

如果需要將動(dòng)畫控制器應(yīng)用到UINavigationController的轉(zhuǎn)場(chǎng)動(dòng)畫中,我們需要使用UINavigationControllerDelegate協(xié)議中的一個(gè)新方法:animationControllerForOperation。對(duì)于任何自定義的導(dǎo)航轉(zhuǎn)場(chǎng)動(dòng)畫,導(dǎo)航欄都會(huì)有一個(gè)淡入淡出的動(dòng)畫過程。同樣,對(duì)于UITabBarController,使用UITabBarControllerDelegate協(xié)議的新方法——animationController-ForTransitionFromViewController。

 為轉(zhuǎn)場(chǎng)動(dòng)畫定義交互方式
在iOS7中,蘋果到處都在使用交互式彈出手勢(shì),同時(shí),蘋果也給開發(fā)者們提供了一系列工具,只需簡(jiǎn)單幾步就能將交互手勢(shì)應(yīng)用在視圖切換過程中。我們可以通過相應(yīng)的委托方法返回一個(gè)交互控制器:

  •  UINavigationController
  • interactionControllerForAnimationController
  • UITabBarController
  • interactionControllerForAnimationController
  • UIViewController
  • interactionControllerForPresentation
  • interactionControllerForDismissal 

這里唯一需要注意的是,如果沒有自定義轉(zhuǎn)場(chǎng)動(dòng)畫,這些方法就不會(huì)起作用。例如,你必須從animationControllerForOperation得到一個(gè)有效的動(dòng)畫控制器,UINavigationController才會(huì)調(diào)用interactionController-
ForAnimationController——即使你在轉(zhuǎn)場(chǎng)交互中沒有使用動(dòng)畫控制器。

其次,交互控制器非常靈活,有很強(qiáng)的可擴(kuò)展性。雖然在示例應(yīng)用程序中我使用手勢(shì)檢測(cè)來控制交互,但是你也可以用手勢(shì)以外的其他方式來實(shí)現(xiàn)。你可以設(shè)計(jì)任意你想要的效果用以轉(zhuǎn)場(chǎng)交互。

交互控制器:最簡(jiǎn)單的實(shí)現(xiàn)方式有兩種方式可以創(chuàng)建交互控制器。第一個(gè)也是最簡(jiǎn)單的一個(gè),就是使用UIPercentDrivenInteractiveTransition。

 @interface UIPercentDrivenInteractiveTransition : NSObject 
 
@property (readonly) CGFloat duration; 
@property (readonly) CGFloat percentComplete; 
@property (nonatomic,assign) CGFloat completionSpeed; 
@property (nonatomic,assign) UIViewAnimationCurve 
completionCurve; 
- (void)updateInteractiveTransition:(CGFloat)percentComplete; 
- (void)cancelInteractiveTransition; 
- (void)finishInteractiveTransition; 

這個(gè)類具體實(shí)現(xiàn)了UIViewControllerInteractiveTransitioning協(xié)議,我們可以使用它輕松為動(dòng)畫控制器添加自定義的交互方式。只要為目標(biāo)視圖加入手勢(shì)(或者其他交互方式)并調(diào)用updateInteractiveTransition:,傳入動(dòng)畫時(shí)間占整個(gè)過程的百分比即可。同時(shí), 記住在交互完成后調(diào)用finishInteractiveTransition: , 交互被取消時(shí)調(diào)用cancel-InteractiveTransition:。下面的例子展示了如何將捏合手勢(shì)應(yīng)用到轉(zhuǎn)場(chǎng)動(dòng)畫中: 

-(void)handlePinch:(UIPinchGestureRecognizer *)pinch { 
CGFloat scale = pinch.scale; 
switch (pinch.state) { 
case UIGestureRecognizerStateBegan: { 
_startScale = scale; 
self.interactive = YES; 
[self.navigationController 
popViewControllerAnimated:YES]; 
break; 
} 
case UIGestureRecognizerStateChanged: { 
CGFloat percent = (1.0 - scale/_startScale); 
[self updateInteractiveTransition:(percent < 0.0) ? 
0.0 : percent]; 
break; 
} 
case UIGestureRecognizerStateEnded: { 
CGFloat percent = (1.0 - scale/_startScale); 
BOOL cancelled = ([pinch velocity] < 5.0 && percent 
<= 0.3); 
if (cancelled) [self cancelInteractiveTransition]; 
else [self finishInteractiveTransition]; 
break; 
} 
case UIGestureRecognizerStateCancelled: { 
CGFloat percent = (1.0 - scale/_startScale); 
BOOL cancelled = ([pinch velocity] < 5.0 && percent 
<= 0.3); 
if (cancelled) [self cancelInteractiveTransition]; 
else [self finishInteractiveTransition]; 
break; 
} 
} 
} 

當(dāng)你繼承了UIPercentDrivenInteractiveTransition類,交互過程中系統(tǒng)會(huì)自動(dòng)調(diào)用動(dòng)畫控制器的animateTransition:方法,按照你傳遞的percentComplete參數(shù)實(shí)時(shí)地展現(xiàn)動(dòng)畫效果。在交互完成后,它還自動(dòng)調(diào)用animateTransition:方法恢復(fù)到正常狀態(tài),一旦交互完成,我們就可以改變completionSpeed和completionCurve屬性來修改其他的一些樣式。

交互控制器:通過自定義的方式
如果你需要深入控制UIPercentDrivenInteractiveTransition處理轉(zhuǎn)場(chǎng)動(dòng)畫的細(xì)節(jié),那么就不用去繼承該類,而是使用UIViewController-InteractiveTransitioning協(xié)議。此協(xié)議與UIViewController-AnimatedTransitioning類似,我們可以通過該協(xié)議控制所有關(guān)于轉(zhuǎn)場(chǎng)動(dòng)畫的細(xì)節(jié)。在該協(xié)議中我們需要完成以下步驟:

1. 實(shí)現(xiàn)startInteractiveTransition:方法,用于初始化專場(chǎng)動(dòng)畫。
2. 獲取transitionContext 對(duì)象的引用(如果繼承了UIPercentDrivenInteractiveTransition,可以看到它自動(dòng)幫我們完成了這一步驟,因此這里我們必須手動(dòng)獲取該對(duì)象)。
3. 和之前一樣,在適當(dāng)?shù)那闆r下調(diào)用updateInteractiveTransition:,cancelInteractiveTransition和finishInteractiveTransition(對(duì)于導(dǎo)航控制器來說,完成方法中還需要顯示或隱藏導(dǎo)航欄)。
4. 完成后仍然請(qǐng)記住調(diào)用transitionCompleted:。

下面是我通過自定義的交互控制器來實(shí)現(xiàn)與之前相同的動(dòng)畫,仍然是使用捏合手勢(shì)控制轉(zhuǎn)場(chǎng)動(dòng)畫。

 -(void)startInteractiveTransition: 
(id)transitionContext { 
//獲取transitionContext對(duì)象的引用 
_context = transitionContext; 
//獲取容器視圖引用 
UIView *containerView = [transitionContext 
containerView]; 
UIViewController *fromViewController = [transitionContext 
viewControllerForKey:UITransitionContextFromViewControllerKey 
]; 
UIViewController *toViewController = [transitionContext 
viewControllerForKey:UITransitionContextToViewControllerKey]; 
//插入“to”視圖 
toViewController.view.frame = [transitionContext 
finalFrameForViewController:toViewController]; 
[containerView insertSubview:toViewController.view 
belowSubview:fromViewController.view]; 
//保留需要縮?小的視圖的引用 
_transitioningView = fromViewController.view; 
} 
-(void)updateWithPercent:(CGFloat)percent { 
CGFloat scale = fabsf(percent-1.0); 
_transitioningView.transform = 
CGAffineTransformMakeScale(scale, scale); 
[_context updateInteractiveTransition:percent]; 
} 
-(void)end:(BOOL)cancelled { 
if (cancelled) { 
[UIView animateWithDuration:_completionSpeed 
animations:^{ 
_transitioningView.transform = 
CGAffineTransformMakeScale(1.0, 1.0); 
} completion:^(BOOL finished) { 
[_context cancelInteractiveTransition]; 
[_context completeTransition:NO]; 
}]; 
} else { 
[UIView animateWithDuration:_completionSpeed 
animations:^{ 
_transitioningView.transform = 
CGAffineTransformMakeScale(0.0, 0.0); 
} completion:^(BOOL finished) { 
[_context finishInteractiveTransition]; 
[_context completeTransition:YES]; 
}]; 
} 
} 

你可以讓動(dòng)畫控制器同時(shí)實(shí)現(xiàn)UIViewControllerInteractive-Transitioning和 UIViewControllerAnimatedTransitioning(像示例程序中那樣),從而把所有代碼都放在一個(gè)類中。你也可以將交互控制器和動(dòng)畫控制器分成兩個(gè)類——協(xié)議這一語法特性的妙處在于,你可以輕松實(shí)現(xiàn)符合需求的最佳解決方案。

更多小技巧
在block中選擇是否進(jìn)行動(dòng)畫
開發(fā)者或許會(huì)遇到這樣一種情況:在一串精美的動(dòng)畫效果中,我們需要讓某些視圖不進(jìn)行動(dòng)畫,從而營(yíng)造一種動(dòng)靜相宜的效果。在動(dòng)畫block方法推出之前,我們可以在[UIView beginAnimations]和[UIView commitAnimations]之間使用setAnimationsEnabled方法來設(shè)置哪些動(dòng)畫不需要執(zhí)行。而在iOS7SDK中,蘋果公司為開發(fā)者提供了新方法,只要把不需要執(zhí)行的動(dòng)畫寫在block中即可:

 [UIView performWithoutAnimation:^{ 
//確保不執(zhí)行動(dòng)畫 
}]; 

你可以隨時(shí)執(zhí)行這段代碼來控制不需要執(zhí)行的動(dòng)畫。

集合視圖的導(dǎo)航轉(zhuǎn)場(chǎng)動(dòng)畫
你可能對(duì)UICollectionView的setLayout:animated:方法非常熟悉了。在iOS7中,當(dāng)導(dǎo)航控制器推入推出集合視圖控制器時(shí),如果開啟了 useLayout-ToLayoutNavigationTransitions屬性,系統(tǒng)將自動(dòng)調(diào)用setLayout:animated:方法。因此,在你推入集合視圖控制器時(shí),只需要設(shè)置該屬性,導(dǎo)航控制器就可以自動(dòng)執(zhí)行動(dòng)畫,和你手動(dòng)對(duì)集合視圖調(diào)用setLayout:animated方法的效果一樣。

 CollectionViewController *VC = [[CollectionViewController 
alloc] initWithCollectionViewLayout:flowLayout]; 
VC.title = @"Mini Apples"; 
VC.useLayoutToLayoutNavigationTransitions = YES; 
[self.navigationController pushViewController:VC 
animated:YES]; 

轉(zhuǎn)場(chǎng)動(dòng)畫調(diào)度器
還有一個(gè)非常有用的API, 它可以幫助視圖控制器管理轉(zhuǎn)場(chǎng)動(dòng)畫:UIViewControllerTransitionCoordinator協(xié)議。在iOS7中,每一個(gè)視圖控制器(當(dāng)然也包括UINavigationController和UITabBarController)都有一個(gè)transitionCoordinator屬性,該屬性提供了一系列用于轉(zhuǎn)場(chǎng)動(dòng)畫的強(qiáng)大工具,首先我們來看看animateAlongsideTransition:方法。

 [self.transitionCoordinator 
animateAlongsideTransition:^(id
rdinatorContext> context) { 
//要執(zhí)行的動(dòng)畫 
} 
completion:^(id 
context) { 
//動(dòng)畫結(jié)束后執(zhí)行的代碼塊 
}]; 

我們可以通過這個(gè)方法在進(jìn)行轉(zhuǎn)場(chǎng)動(dòng)畫時(shí)并行執(zhí)行一些其他動(dòng)畫,context參數(shù)和之前提到的符合UIViewControllerContextTransitioning協(xié)議的transitionContext參數(shù)相類似,從該參數(shù)中我們可以獲取有關(guān)轉(zhuǎn)場(chǎng)過程的一些重要信息,包括container view和轉(zhuǎn)場(chǎng)效果。蘋果公司甚至允許開發(fā)者不傳入context參數(shù),只傳入完成后執(zhí)行的block。所以請(qǐng)大膽嘗試使用它吧。

對(duì)于交互轉(zhuǎn)場(chǎng)來說, 視圖在轉(zhuǎn)場(chǎng)過程中狀態(tài)可能發(fā)生改變, 于是notifyWhenInteractionEndsUsingBlock:方法特別有用——它可以用來管理視圖狀態(tài)。在交互轉(zhuǎn)場(chǎng)中,viewWillAppear:方法或許會(huì)在某個(gè)視圖控制器推入時(shí)被調(diào)用,但是按照常理隨后應(yīng)該會(huì)被調(diào)用的viewDidAppear:則不一定,因?yàn)橛脩綦S時(shí)可能取消該交互(例如在之前的例子中,捏到一半又恢復(fù)原狀)。 

由此,如果我們不希望在這種情況下修改視圖狀態(tài),我們可以使用該方法,恢復(fù)對(duì)視圖的更改(使用UIViewControllerTransitionCoordinatorContext的isCancelled屬性)。

 [self.transitionCoordinator 
notifyWhenInteractionEndsUsingBlock:^(id
sitionCoordinatorContext> context) { 
//動(dòng)畫結(jié)束后執(zhí)?行的代碼塊 
}]; 
 

屏幕快照
在iOS7 以前, 獲取一個(gè)UIView的快照有以下步驟: 首先創(chuàng)建一個(gè)UIGraphics的圖像上下文,然后將視圖的layer渲染到該上下文中,從而取得一個(gè)圖像,最后關(guān)閉圖像上下文,并將圖像顯示在UIImageView中?,F(xiàn)在我們只需要一行代碼就可以完成上述步驟了: 

[view snapshotViewAfterScreenUpdates:NO]; 

這個(gè)方法制作了一個(gè)UIView的副本,如果我們希望視圖在執(zhí)行動(dòng)畫之前保存現(xiàn)在的外觀,以備之后使用(動(dòng)畫中視圖可能會(huì)被子視圖遮蓋或者發(fā)生其他一些變化),該方法就特別方便。 

afterUpdates參數(shù)表示是否在所有效果應(yīng)用在視圖上了以后再獲取快照。例如,如果該參數(shù)為NO,則立馬獲取該視圖現(xiàn)在狀態(tài)的快照,反之,以下代碼只能得到一個(gè)空白快照: 

[view snapshotViewAfterScreenUpdates:YES]; 
[view setAlpha:0.0]; 

由于我們?cè)O(shè)置afterUpdates參數(shù)為YES,而視圖的透明度值被設(shè)置成了0,所以方法將在該設(shè)置應(yīng)用在視圖上了之后才進(jìn)行快照,于是乎屏幕空空如也。另外就是……你可以對(duì)快照再進(jìn)行快照……繼續(xù)快照……
蘋果公司在iOS7中為開發(fā)者添加了新的用于創(chuàng)建和自定義動(dòng)畫的API。iOS7 SDK不僅引入了強(qiáng)大的動(dòng)畫block和許多易于使用的方法,而且徹底改變了為視圖自定義動(dòng)畫的方式。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • ios8 UITableView設(shè)置 setSeparatorInset UIEdgeInsetsZero不起作用的解決辦法(去掉15px空白間距)

    ios8 UITableView設(shè)置 setSeparatorInset UIEdgeInsetsZero不起作用的解決

    這篇文章主要介紹了ios8 UITableView設(shè)置 setSeparatorInset UIEdgeInsetsZero不起作用的解決辦法(去掉15px空白間距)的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 使用IOS AirPrint實(shí)現(xiàn)打印功能詳解

    使用IOS AirPrint實(shí)現(xiàn)打印功能詳解

    這篇文章主要介紹了使用IOS AirPrint實(shí)現(xiàn)打印功能詳解,想了解無線打印的同學(xué),一定要看一下
    2021-04-04
  • iOS 使用Moya網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方法

    iOS 使用Moya網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方法

    這篇文章主要介紹了iOS 使用Moya網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • iOS實(shí)現(xiàn)小型計(jì)算器

    iOS實(shí)現(xiàn)小型計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)小型計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • ios啟動(dòng)頁(yè)強(qiáng)制豎屏(進(jìn)入App后允許橫屏與豎屏)

    ios啟動(dòng)頁(yè)強(qiáng)制豎屏(進(jìn)入App后允許橫屏與豎屏)

    最近工作遇到這樣一個(gè)需要,當(dāng)進(jìn)入啟動(dòng)頁(yè)需要強(qiáng)制豎屏,而進(jìn)入APP后就允許橫屏與豎屏,通過查找相關(guān)的資料找到了解決的方法,所以將實(shí)現(xiàn)的方法整理后分享出來,需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • iOS App中UIPickerView選擇欄控件的使用實(shí)例解析

    iOS App中UIPickerView選擇欄控件的使用實(shí)例解析

    這篇文章主要介紹了iOS App中的UIPickerView選擇欄控件的使用,文中演示了兩個(gè)超詳細(xì)的例子,示例代碼為Objective-C,需要的朋友可以參考下
    2016-04-04
  • iOS app中無網(wǎng)絡(luò)頁(yè)面的添加方法詳解

    iOS app中無網(wǎng)絡(luò)頁(yè)面的添加方法詳解

    這篇文章主要給大家介紹了關(guān)于iOS app中無網(wǎng)絡(luò)頁(yè)面的添加方法的相關(guān)資料,通過文中提供的方法可以很方便的給大家進(jìn)行提供一個(gè)提醒,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • iOS實(shí)現(xiàn)簡(jiǎn)單的頭部縮放功能

    iOS實(shí)現(xiàn)簡(jiǎn)單的頭部縮放功能

    這篇文章主要介紹了iOS 簡(jiǎn)單的頭部縮放效果,頭部伴隨模糊效果放大縮小,并在一定位置時(shí)懸停充當(dāng)導(dǎo)航欄,本文給大家提供實(shí)現(xiàn)思路,需要的朋友可以參考下
    2018-08-08
  • iOS消息發(fā)送和轉(zhuǎn)發(fā)示例詳解

    iOS消息發(fā)送和轉(zhuǎn)發(fā)示例詳解

    這篇文章主要給大家介紹了關(guān)于iOS消息發(fā)送和轉(zhuǎn)發(fā)的相關(guān)資料,用Objective-C的術(shù)語來講,這叫做“給某個(gè)對(duì)象發(fā)送某條消息”。文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • iOS開發(fā)中音頻視頻播放的簡(jiǎn)單實(shí)現(xiàn)方法

    iOS開發(fā)中音頻視頻播放的簡(jiǎn)單實(shí)現(xiàn)方法

    視頻音頻是我們?cè)趇os日常開發(fā)中經(jīng)常會(huì)遇到的一個(gè)需求,所以下面這篇文章主要給大家介紹了關(guān)于iOS開發(fā)中音頻視頻播放的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10

最新評(píng)論