1. 程式人生 > >iOS動畫--UIView自帶動畫效果、Block動畫

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];

//設定動畫開始和結束減速

    [

UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];

//設定過濾效果,第二個引數填寫父檢視的View

    [UIViewsetAnimationTransition:UIViewAnimationTransitionCurlUpforView:self.windowcache:YES];

    view1.backgroundColor=[UIColorblueColor];

    view1.frame=CGRectMake(20, 100, 200, 200);

//設定代理

    [UIViewsetAnimationDelegate:

self];

//設定動畫完成後呼叫的方法

    [UIViewsetAnimationDidStopSelector:@selector(stopAnimate)];

/******************************/

    /*

      UIView自帶動畫實際是在程式執行的程序中,有主執行緒建立了

一個副執行緒,由這個副執行緒來完成動畫。上述設定動畫完成後呼叫的方法,

其實質就是使用了代理的回撥。(代理的作用就是正向傳值和反向傳值)

回撥就是反向傳值。因為主執行緒並不知道副執行緒什麼時候完成動畫,所以副執行緒成為了委託方,主執行緒成為了代理方。當動畫完成後,會呼叫副執行緒中協議中的AnimationDidStop

,而主執行緒中在實現這個方法中呼叫了一個新的方法來處理資料。( [UIView setAnimationDidStopSelector:@selector(stopAnimate)];就是在主執行緒中設定了一個新的方法,來處理資料。)

實際開發中使用最多的時候,還是代理回撥,比如副執行緒去下載圖片,主執行緒獲取圖片,然後再處理圖片資料

當然回撥這個感念並不是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) {

    }];