iOS動(dòng)畫總結(jié):UIView動(dòng)畫
執(zhí)行動(dòng)畫所需要的工作由UIView類自動(dòng)完成,但仍要在希望執(zhí)行動(dòng)畫時(shí)通知視圖,為此需要將改變屬性的代碼包裝到一個(gè)代碼塊中。
1.UIView動(dòng)畫具體創(chuàng)建方法
- (void)buttonPressed
{
// 交換本視圖控制器中2個(gè)view位置
[self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
//UIView開始動(dòng)畫,第一個(gè)參數(shù)是動(dòng)畫的標(biāo)識(shí),第二個(gè)參數(shù)附加的應(yīng)用程序信息用來傳遞給動(dòng)畫代理消息
[UIView beginAnimations:@"View Flip" context:nil];
//動(dòng)畫持續(xù)時(shí)間
[UIView setAnimationDuration:1.25];
//設(shè)置動(dòng)畫的回調(diào)函數(shù),設(shè)置后可以使用回調(diào)方法
[UIView setAnimationDelegate:self];
//設(shè)置動(dòng)畫曲線,控制動(dòng)畫速度
[UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
//設(shè)置動(dòng)畫方式,并指出動(dòng)畫發(fā)生的位置
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
//提交UIView動(dòng)畫
[UIView commitAnimations];
}
- (void)viewDidLoad
{
[super viewDidLoad];
//主要功能通過UIView動(dòng)畫完成2個(gè)試圖控制器的切換
self.blueController = [[BlueViewController alloc] initWithNibName:nil bundle:nil];
//設(shè)置導(dǎo)航控制器view的大小占整個(gè)屏幕
[self.blueController.view setFrame:CGRectMake(0, 0, self.view.frame.size.width , self.view.frame.size.height)];
self.yellowController = [[YellowController alloc]initWithNibName:nil bundle:nil ];
[self.yellowController.view setFrame:CGRectMake(0, 0, self.view.frame.size.width , self.view.frame.size.height)];
//將2個(gè)控制器view插入到目前導(dǎo)航控制器視圖上,yellowController后插入,顯示在最前面
[self.view insertSubview:self.blueController.view atIndex:0];
[self.view insertSubview:self.yellowController.view atIndex:1];
//創(chuàng)建導(dǎo)航控制器右按鈕,按鈕名字叫next
//添加buttonPressed 事件
self.rightBarItem = [[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStylePlain target:self action:@selector(buttonPressed)];
//將按鈕添加到導(dǎo)航控制器默認(rèn)右按鈕上
self.navigationItem.rightBarButtonItem = self.rightBarItem;
}
有個(gè)問題:如果動(dòng)畫不放在按鈕事件中,直接放到viewDidLoad里,程序首先執(zhí)行這個(gè)controller,這時(shí)動(dòng)畫是不會(huì)顯示的。
原因:出現(xiàn)這個(gè)問題是因?yàn)殚_機(jī)時(shí)候系統(tǒng)有個(gè)動(dòng)畫,系統(tǒng)動(dòng)畫和這個(gè)動(dòng)畫重復(fù)了。
解決方案:
1。將動(dòng)畫寫在按鈕事件中
2。利用定時(shí)器。
轉(zhuǎn):UIView動(dòng)畫更具體講解; http://wsqwsq000.iteye.com/blog/1189183
areAnimationsEnabled
返回一個(gè)布爾值表示動(dòng)畫是否結(jié)束。
+ (BOOL)areAnimationsEnabled
返回值
如果動(dòng)畫結(jié)束返回YES,否則NO。
beginAnimations:context:
開始一個(gè)動(dòng)畫塊
+ (void)beginAnimations:(NSString *)animationID context:(void *)context
參數(shù)
animationID
動(dòng)畫塊內(nèi)部應(yīng)用程序標(biāo)識(shí)用來傳遞給動(dòng)畫代理消息-這個(gè)選擇器運(yùn)用setAnimationWillStartSelector:和setAnimationDidStopSelector: 方法來設(shè)置。
context
附加的應(yīng)用程序信息用來傳遞給動(dòng)畫代理消息-這個(gè)選擇器使用setAnimationWillStartSelector: 和setAnimationDidStopSelector: 方法。
討論
這個(gè)值改變是因?yàn)樵O(shè)置了一些需要在動(dòng)畫塊中產(chǎn)生動(dòng)畫的屬性。動(dòng)畫塊可以被嵌套。如果在沒有在動(dòng)畫塊中調(diào)用那么setAnimation類方法將什么都不做。使用 beginAnimations:context:來開始一個(gè)動(dòng)畫塊并用commitAnimations類方法來結(jié)束一個(gè)動(dòng)畫塊。
commitAnimations
結(jié)束一個(gè)動(dòng)畫塊并開始當(dāng)他在動(dòng)畫塊外時(shí)。
+ (void)commitAnimations
討論
如果當(dāng)前的動(dòng)畫塊是最外層的動(dòng)畫塊,當(dāng)應(yīng)用程序返回到循環(huán)運(yùn)行時(shí)開始動(dòng)畫塊。動(dòng)畫在一個(gè)獨(dú)立的線程中所有應(yīng)用程序不會(huì)中斷。使用這個(gè)方法,多個(gè)動(dòng)畫可以被實(shí)現(xiàn)。查看setAnimationBeginsFromCurrentState:來了解如果開始一個(gè)動(dòng)畫當(dāng)另外一個(gè)動(dòng)畫在播放的時(shí)候。
layerClass
返回類用來創(chuàng)建這一個(gè)本類的layer實(shí)例對(duì)象。
+ (Class)layerClass
返回值
一個(gè)用來創(chuàng)建視圖layer的類
討論
重寫子類來指定一個(gè)自定義類用來顯示。當(dāng)在創(chuàng)建視圖layer時(shí)候調(diào)用。默認(rèn)的值是CALayer類對(duì)象。
setAnimationBeginsFromCurrentState
:
設(shè)置動(dòng)畫從當(dāng)前狀態(tài)開始播放。
+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState
參數(shù)
fromCurrentState
YES如果動(dòng)畫需要從他們當(dāng)前狀態(tài)開始播放。否則為NO。
討論
如果設(shè)置為YES那么當(dāng)動(dòng)畫在運(yùn)行過程中,當(dāng)前視圖的位置將會(huì)作為新的動(dòng)畫的開始狀態(tài)。如果設(shè)置為NO,當(dāng)前動(dòng)畫結(jié)束前新動(dòng)畫將使用視圖最後狀態(tài)的位置作 為開始狀態(tài)。這個(gè)方法將不會(huì)做任何事情如果動(dòng)畫沒有運(yùn)行或者沒有在動(dòng)畫塊外調(diào)用。使用beginAnimations:context:類方法來開始并用 commitAnimations類方法來結(jié)束動(dòng)畫塊。默認(rèn)值是NO。
setAnimationCurve
:
設(shè)置動(dòng)畫塊中的動(dòng)畫屬性變化的曲線。
+ (void)setAnimationCurve:(UIViewAnimationCurve)curve
討論
動(dòng)畫曲線是動(dòng)畫運(yùn)行過程中相對(duì)的速度。如果在動(dòng)畫塊外調(diào)用這個(gè)方法將會(huì)無效。使用 beginAnimations:context:類方法來開始動(dòng)畫塊并用commitAnimations來結(jié)束動(dòng)畫塊。默認(rèn)動(dòng)畫曲線的值是 UIViewAnimationCurveEaseInOut。
setAnimationDelay:
在動(dòng)畫塊中設(shè)置動(dòng)畫的延遲屬性(以秒為單位)
+ (void)setAnimationDelay:(NSTimeInterval)delay
討論
這個(gè)方法在動(dòng)畫塊外調(diào)用無效。使用beginAnimations:context: 類方法開始一個(gè)動(dòng)畫塊并用commitAnimations類方法結(jié)束動(dòng)畫塊。默認(rèn)的動(dòng)畫延遲是0.0秒。
setAnimationDelegate:
設(shè)置動(dòng)畫消息的代理。
+ (void)setAnimationDelegate:(id)delegate
參數(shù)
delegate
你可以用setAnimationWillStartSelector:和setAnimationDidStopSelector: 方法來設(shè)置接收代理消息的對(duì)象。
討論
這個(gè)方法在動(dòng)畫塊外沒有任何效果。使用beginAnimations:context:類方法開始一個(gè)動(dòng)畫塊并用commitAnimations類方法結(jié)束一個(gè)動(dòng)畫塊。默認(rèn)值是nil
setAnimationDidStopSelector:
設(shè)置消息給動(dòng)畫代理當(dāng)動(dòng)畫停止的時(shí)候。
+ (void)setAnimationDidStopSelector:(SEL)selector
參數(shù)
selector
當(dāng)動(dòng)畫結(jié)束的時(shí)候發(fā)送給動(dòng)畫代理。默認(rèn)值是NULL。這個(gè)選擇者須有下面方法的簽名:animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context。
animationID
一個(gè)應(yīng)用程序提供的標(biāo)識(shí)符。和傳給beginAnimations:context: 相同的參數(shù)。這個(gè)參數(shù)可以為空。
finished
如果動(dòng)畫在停止前完成那返回YES;否則就是NO。
context
一個(gè)可選的應(yīng)用程序內(nèi)容提供者。和beginAnimations:context: 方法相同的參數(shù)。可以為空。
討論
這個(gè)方法在動(dòng)畫塊外沒有任何效果。使用beginAnimations:context: 類方法來開始一個(gè)動(dòng)畫塊并用commitAnimations類方法結(jié)束。默認(rèn)值是NULL。
setAnimationDuration:
設(shè)置動(dòng)畫塊中的動(dòng)畫持續(xù)時(shí)間(用秒)
+ (void)setAnimationDuration:(NSTimeInterval)duration
參數(shù)
duration
一段動(dòng)畫持續(xù)的時(shí)間。
討論
這個(gè)方法在動(dòng)畫塊外沒有效果。使用beginAnimations:context: 類方法來開始一個(gè)動(dòng)畫塊并用commitAnimations類方法來結(jié)束一個(gè)動(dòng)畫塊。默認(rèn)值是0.2。
setAnimationRepeatAutoreverses:
設(shè)置動(dòng)畫塊中的動(dòng)畫效果是否自動(dòng)重復(fù)播放。
+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses
參數(shù)
repeatAutoreverses
如果動(dòng)畫自動(dòng)重復(fù)就是YES否則就是NO。
討論
自動(dòng)重復(fù)是當(dāng)動(dòng)畫向前播放結(jié)束後再重頭開始播放。使用setAnimationRepeatCount: 類方法來指定動(dòng)畫自動(dòng)重播的時(shí)間。如果重復(fù)數(shù)為0或者在動(dòng)畫塊外那將沒有任何效果。使用beginAnimations:context:類方法來開始一個(gè)動(dòng)畫塊并用commitAnimations方法來結(jié)束一個(gè)動(dòng)畫塊。默認(rèn)值是NO。
setAnimationRepeatCount:
設(shè)置動(dòng)畫在動(dòng)畫模塊中的重復(fù)次數(shù)
+ (void)setAnimationRepeatCount:(float)repeatCount
參數(shù)
repeatCount
動(dòng)畫重復(fù)的次數(shù),這個(gè)值可以是分?jǐn)?shù)。
討論
這個(gè)屬性在動(dòng)畫塊外沒有任何作用。使用beginAnimations:context:類方法來開始一個(gè)動(dòng)畫塊并用commitAnimations類方法來結(jié)束。默認(rèn)動(dòng)畫不循環(huán)。
setAnimationsEnabled:
設(shè)置是否激活動(dòng)畫
+ (void)setAnimationsEnabled:(BOOL)enabled
參數(shù)
enabled
如果是YES那就激活動(dòng)畫;否則就是NO
討論
當(dāng)動(dòng)畫參數(shù)沒有被激活那么動(dòng)畫屬性的改變將被忽略。默認(rèn)動(dòng)畫是被激活的。
setAnimationStartDate:
設(shè)置在動(dòng)畫塊內(nèi)部動(dòng)畫屬性改變的開始時(shí)間
+ (void)setAnimationStartDate:(NSDate *)startTime
參數(shù)
startTime
一個(gè)開始動(dòng)畫的時(shí)間
討論
使用beginAnimations:context:類方法來開始一個(gè)動(dòng)畫塊并用commitAnimations類方法來結(jié)束動(dòng)畫塊。默認(rèn)的開始時(shí)間值由CFAbsoluteTimeGetCurrent方法來返回。
setAnimationTransition:forView:cache:
在動(dòng)畫塊中為視圖設(shè)置過渡
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache
參數(shù)
transition
把一個(gè)過渡效果應(yīng)用到視圖中。可能的值定義在UIViewAnimationTransition中。
view
需要過渡的視圖對(duì)象。
cache
如果是YES,那么在開始和結(jié)束圖片視圖渲染一次并在動(dòng)畫中創(chuàng)建幀;否則,視圖將會(huì)在每一幀都渲染。例如緩存,你不需要在視圖轉(zhuǎn)變中不停的更新,你只需要等到轉(zhuǎn)換完成再去更新視圖。
討論
如果你想要在轉(zhuǎn)變過程中改變視圖的外貌。舉個(gè)例子,文件從一個(gè)視圖到另一個(gè)視圖,然後使用一個(gè)UIView子類的容器視圖,如下:
1.Begin an animation block.
2.Set the transition on the container view.
3.Remove the subview from the container view.
4.Add the new subview to the container view.
5.Commit the animation block.
1.開始一個(gè)動(dòng)畫塊。 2.在容器視圖中設(shè)置轉(zhuǎn)換。 3.在容器視圖中移除子視圖。 4.在容器視圖中添加子視圖。 5.結(jié)束動(dòng)畫塊。
setAnimationWillStartSelector:
當(dāng)動(dòng)畫開始時(shí)發(fā)送一條消息到動(dòng)畫代理
+ (void)setAnimationWillStartSelector:(SEL)selector
參數(shù)
selector
在動(dòng)畫開始前向動(dòng)畫代理發(fā)送消息。默認(rèn)值是NULL。這個(gè)selector必須由和beginAnimations:context: 方法相同的參數(shù),一個(gè)任選的程序標(biāo)識(shí)和內(nèi)容。這些參數(shù)都可以是nil。
討論
這個(gè)方法在動(dòng)畫塊外沒有任何作用。使用beginAnimations:context:類方法來開始一個(gè)動(dòng)畫塊并用commitAnimations類方法來結(jié)束。