iOS動畫--UIView自帶動畫效果、Block動畫
UIView自帶動畫
UIView *view1=[[UIViewalloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
view1.tag=100;
view1.backgroundColor=[UIColororangeColor];
[self.window addSubview:view1];
//開啟動畫
[UIViewbeginAnimations:nilcontext:Nil];
//設定動畫總時間
[UIViewsetAnimationDuration:5];
//設定動畫開始和結束減速
[
//設定過濾效果,第二個引數填寫父檢視的View
[UIViewsetAnimationTransition:UIViewAnimationTransitionCurlUpforView:self.windowcache:YES];
view1.backgroundColor=[UIColorblueColor];
view1.frame=CGRectMake(20, 100, 200, 200);
//設定代理
[UIViewsetAnimationDelegate:
//設定動畫完成後呼叫的方法
[UIViewsetAnimationDidStopSelector:@selector(stopAnimate)];
/******************************/
/*
UIView自帶動畫實際是在程式執行的程序中,有主執行緒建立了
一個副執行緒,由這個副執行緒來完成動畫。上述設定動畫完成後呼叫的方法,
其實質就是使用了代理的回撥。(代理的作用就是正向傳值和反向傳值)
回撥就是反向傳值。因為主執行緒並不知道副執行緒什麼時候完成動畫,所以副執行緒成為了委託方,主執行緒成為了代理方。當動畫完成後,會呼叫副執行緒中協議中的AnimationDidStop
實際開發中使用最多的時候,還是代理回撥,比如副執行緒去下載圖片,主執行緒獲取圖片,然後再處理圖片資料
當然回撥這個感念並不是OC中第一次出現的,函式回撥早在C++中就早已被使用,JAVA中也有,OC只是沿用了這些語言的優點。回撥函式,其實和嵌入式中的定時器中端函式,很類似。生活中也常常存在這樣的例子。比如:老爸叫兒子出去買瓶醬油,然後兒子出去買醬油,老爸接著洗菜,切菜,做飯(並不會停下來等兒子買完醬油再做這些事),當兒子買完醬油後,敲門,告訴老爸,醬油買回來了,然後把醬油交給老爸。老爸在往菜里加醬油(使用資料)。
*/
/******************************/
//提交動畫
[UIViewcommitAnimations];
[self.windowmakeKeyAndVisible];
return YES;
}
-(void)stopAnimate
{
UIView *view=[self.window viewWithTag:100];
//開啟動畫
[UIViewbeginAnimations:nilcontext:Nil];
//設定動畫總時間
[UIViewsetAnimationDuration:5];
view.backgroundColor=[UIColorredColor];
//提交動畫
[UIViewcommitAnimations];
}
Block動畫
// 使用UIView自帶動畫
// [UIView beginAnimations:Nil context:nil];
// [UIView setAnimationDuration:1];
// [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.window cache:YES];
//
// [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; //交換兩個子檢視
// [UIView commitAnimations];
//使用block動畫
//01 普通block動畫
// [UIView animateWithDuration:1 animations:^{
// [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.window cache:YES];
// [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; //交換兩個子檢視
// }];
//02 帶有回撥的block動畫
// [UIView animateWithDuration:1 animations:^{
// [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.window cache:YES];
// [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; //交換兩個子檢視
//
// } completion:^(BOOL finished){
// NSLog(@"動畫完成");
//
// }];
//03 帶有動畫效果的block動畫,
[UIViewtransitionWithView:self.windowduration:2.0options:UIViewAnimationOptionTransitionCurlUpanimations:^{
[self.windowexchangeSubviewAtIndex:0withSubviewAtIndex:1]; //交換兩個子檢視
} completion:^(BOOL finished) {
}];