iOS UIView動畫

iOS 動畫給人一種很流暢的感覺,提升用戶體驗载萌,在APP開發(fā)過程中,我們只要利用好系統(tǒng)的動畫知给,基本可以解決大部分的需求轩勘。

UIView動畫實質(zhì)上是Core Animation的封裝和泌,系統(tǒng)提供簡潔的動畫接口梯皿。

其中UIView動畫可以設(shè)置的屬性有:

  1. frame 大小
  2. bounds 拉伸
  3. center 中心位置
  4. transform 旋轉(zhuǎn)
  5. alpha 透明度
  6. backgroundColor 背景色
  7. contentStretch 拉伸內(nèi)容

UIView類動畫

API
  /// 動畫開始標(biāo)記
  /// 第一個參數(shù):動畫標(biāo)識
  /// 附加參數(shù),在設(shè)置了代理的情況下县恕,此參數(shù)將發(fā)送到setAnimationWillStartSelector和setAnimationDidStopSelector所指定的方法东羹。大部分情況下,我們設(shè)置為nil即可忠烛。
  [UIView beginAnimations:(nullable NSString *)animationID context:(nullable void *)context]
  
  /// 動畫持續(xù)時間
  [UIView setAnimationDuration:(NSTimeInterval)];
  /// 動畫代理設(shè)置
  [UIView setAnimationDelegate:(nullable id)];
  ///  設(shè)置動畫開始執(zhí)行的回調(diào)SEL
  [UIView setAnimationWillStartSelector:(nullable SEL)];
  /// 設(shè)置動畫執(zhí)行結(jié)束的的回調(diào)SEL
  [UIView setAnimationDidStopSelector:(nullable SEL)];
  /// 設(shè)置動畫延遲執(zhí)行的時間
  [UIView setAnimationDelay:(NSTimeInterval)];
  /// 設(shè)置動畫執(zhí)行的重復(fù)次數(shù)
  [UIView setAnimationRepeatCount:(float)];
  /// 設(shè)置動畫過渡曲線
  [UIView setAnimationCurve:(UIViewAnimationCurve)];

  UIViewAnimationCurve是一個枚舉:
  UIViewAnimationCurveEaseInOut,         //緩入緩出 中間快
  UIViewAnimationCurveEaseIn,               // 由慢到快(緩入快出)
  UIViewAnimationCurveEaseOut,           // 由快到慢(快入緩出)
  UIViewAnimationCurveLinear,               // 勻速
  
  /// 設(shè)置是否從當(dāng)前狀態(tài)開始播放
  /// 假設(shè)上一個動畫正在播放,且未播放完成, 我們將要執(zhí)行新的動畫.
  /// 當(dāng)YES時,動畫將從上一個動畫所在的狀態(tài)開始播放
  /// 當(dāng)NO時,動畫將從上一個動畫所指定的最終狀態(tài)開始播放(此時上一個動畫馬上結(jié)束)
  [UIView setAnimationBeginsFromCurrentState:YES];

  /// 動畫是否繼續(xù)執(zhí)行相反的動畫
  [UIView setAnimationRepeatAutoreverses:(BOOL)];

  /// 是否禁用動畫效果(對象屬性依然會該拜年,只是沒有動畫過渡效果)
  [UIView setAnimationsEnabled:(BOOL)];

  /// 設(shè)置視圖過渡效果
  [UIView setAnimationTransition:(UIViewAnimationTransition) forView:(nonnull UIView *) cache:(BOOL)];

/*  
第一個參數(shù): UIViewAnimationTransition,是一個枚舉
    UIViewAnimationTransitionNone,                   // 不使用動畫
    UIViewAnimationTransitionFlipFromLeft,      // 從左向右旋轉(zhuǎn)翻頁
    UIViewAnimationTransitionFlipFromRight,    // 從右向左旋轉(zhuǎn)翻頁
    UIViewAnimationTransitionCurlUp,                // 從下往上卷曲翻頁
    UIViewAnimationTransitionCurlDown,           // 從上往下卷曲翻頁

第二個參數(shù):需要知心過渡動畫的view
第三個參數(shù):是否使用視圖緩存,YES:視圖在開始和結(jié)束時渲染一次,NO:視圖在每一幀都渲染
*/

實例展示

  1. 改變屬性frame
- (void)animation1{
    [UIView beginAnimations:@"FrameAnimation" context:@"232323"];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationWillStartSelector:@selector(startAnimation:context:)];
    [UIView setAnimationDidStopSelector:@selector(stopAnimation:)];
    [UIView setAnimationRepeatCount:1];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    self.giftView.frame = self.heartView.frame;
    [UIView commitAnimations];
}

//返回context參數(shù)
- (void)startAnimation:(NSString *)aniID context:(NSString *)context{
    
}

- (void)startAnimation:(NSString *)aniID{
    NSLog(@"%@",aniID);
}

- (void)stopAnimation:(NSString *)aniID{
    NSLog(@"%@",aniID);
}

效果圖


asda.gif
  1. 轉(zhuǎn)場效果動畫
//轉(zhuǎn)場動畫
- (void)transitions{

   [UIView beginAnimations:@"FlipAni" context:nil];
   [UIView setAnimationDuration:1.0];
   [UIView setAnimationDelegate:self];
   [UIView setAnimationWillStartSelector:@selector(startAnimation:)];
   [UIView setAnimationDidStopSelector:@selector(stopAnimation:)];
   [UIView setAnimationRepeatCount:1];
   [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
   [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.giftView cache:NO];
   self.giftView.image = [UIImage imageNamed:@"local_2"];
   [UIView commitAnimations];
}

效果圖


asda.gif

UIView Block動畫

  1. UIView BLock動畫方法,都是比較常用的方法
[UIView animateWithDuration:(NSTimeInterval)  //動畫持續(xù)時間
                                 animations:^{
                                //執(zhí)行的動畫
 }];

 [UIView animateWithDuration:(NSTimeInterval)  //動畫持續(xù)時間
                  animations:^{
                //執(zhí)行的動畫
 }                completion:^(BOOL finished) {
                //動畫執(zhí)行完畢后的操作
 }];

 [UIView animateWithDuration:(NSTimeInterval) //動畫持續(xù)時間
                       delay:(NSTimeInterval) //動畫延遲執(zhí)行的時間
                     options:(UIViewAnimationOptions) //動畫的過渡效果
                  animations:^{
                   //執(zhí)行的動畫
 }                completion:^(BOOL finished) {
                   //動畫執(zhí)行完畢后的操作
 }];

我們詳細說一下UIViewAnimationOptions這個枚舉值,可以參考iOS動畫中的枚舉UIViewAnimationOptions

    UIViewAnimationOptionLayoutSubviews            //提交動畫的時候布局子控件属提,表示子控件將和父控件一同動畫。
    UIViewAnimationOptionAllowUserInteraction      //動畫時允許用戶交流美尸,比如觸摸
    UIViewAnimationOptionBeginFromCurrentState     //從當(dāng)前狀態(tài)開始動畫
    UIViewAnimationOptionRepeat                    //動畫無限重復(fù)
    UIViewAnimationOptionAutoreverse               //執(zhí)行動畫回路,前提是設(shè)置動畫無限重復(fù)
    UIViewAnimationOptionOverrideInheritedDuration //忽略外層動畫嵌套的執(zhí)行時間
    UIViewAnimationOptionOverrideInheritedCurve    //忽略外層動畫嵌套的時間變化曲線
    UIViewAnimationOptionAllowAnimatedContent      //通過改變屬性和重繪實現(xiàn)動畫效果冤议,如果key沒有提交動畫將使用快照
    UIViewAnimationOptionShowHideTransitionViews   //用顯隱的方式替代添加移除圖層的動畫效果
    UIViewAnimationOptionOverrideInheritedOptions  //忽略嵌套繼承的選項

   //時間函數(shù)曲線相關(guān)
    UIViewAnimationOptionCurveEaseInOut            //時間曲線函數(shù),緩入緩出师坎,中間快
    UIViewAnimationOptionCurveEaseIn               //時間曲線函數(shù)求类,由慢到特別快(緩入快出)
    UIViewAnimationOptionCurveEaseOut              //時間曲線函數(shù),由快到慢(快入緩出)
    UIViewAnimationOptionCurveLinear               //時間曲線函數(shù)屹耐,勻速

   //轉(zhuǎn)場動畫相關(guān)的
    UIViewAnimationOptionTransitionNone            //無轉(zhuǎn)場動畫
    UIViewAnimationOptionTransitionFlipFromLeft    //轉(zhuǎn)場從左翻轉(zhuǎn)
    UIViewAnimationOptionTransitionFlipFromRight   //轉(zhuǎn)場從右翻轉(zhuǎn)
    UIViewAnimationOptionTransitionCurlUp          //上卷轉(zhuǎn)場
    UIViewAnimationOptionTransitionCurlDown        //下卷轉(zhuǎn)場
    UIViewAnimationOptionTransitionCrossDissolve   //轉(zhuǎn)場交叉消失
    UIViewAnimationOptionTransitionFlipFromTop     //轉(zhuǎn)場從上翻轉(zhuǎn)
    UIViewAnimationOptionTransitionFlipFromBottom  //轉(zhuǎn)場從下翻轉(zhuǎn)

  1. Spring Block Animation
    適用于所有可被添加動畫效果的屬性
 [UIView animateWithDuration:(NSTimeInterval)//動畫持續(xù)時間
                       delay:(NSTimeInterval)//動畫延遲執(zhí)行的時間
      usingSpringWithDamping:(CGFloat)//阻尼系數(shù),范圍0~1椿猎,數(shù)值越小震動效果越明顯
       initialSpringVelocity:(CGFloat)//初始速度惶岭,數(shù)值越大初始速度越快
                     options:(UIViewAnimationOptions)//動畫的過渡效果
                  animations:^{
                     //執(zhí)行的動畫
 }
                  completion:^(BOOL finished) {
                     //動畫執(zhí)行完畢后的操作
 }];
  1. Keyframes動畫
    iOS7新增關(guān)鍵幀動畫,支持屬性關(guān)鍵幀,不支持路徑關(guān)鍵幀
 [UIView animateKeyframesWithDuration:(NSTimeInterval)//動畫持續(xù)時間
                                delay:(NSTimeInterval)//動畫延遲執(zhí)行的時間
                              options:(UIViewKeyframeAnimationOptions)//動畫的過渡效果
                           animations:^{
                         //執(zhí)行的關(guān)鍵幀動畫
 }
                           completion:^(BOOL finished) {
                         //動畫執(zhí)行完畢后的操作
 }];

UIViewKeyframeAnimationOptions枚舉(可以組合使用):
UIViewAnimationOptionLayoutSubviews           //進行動畫時布局子控件
UIViewAnimationOptionAllowUserInteraction     //進行動畫時允許用戶交互
UIViewAnimationOptionBeginFromCurrentState    //從當(dāng)前狀態(tài)開始動畫
UIViewAnimationOptionRepeat                   //無限重復(fù)執(zhí)行動畫
UIViewAnimationOptionAutoreverse              //執(zhí)行動畫回路
UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套動畫的執(zhí)行時間設(shè)置
UIViewAnimationOptionOverrideInheritedOptions //不繼承父動畫設(shè)置

UIViewKeyframeAnimationOptionCalculationModeLinear     //運算模式 :連續(xù)
UIViewKeyframeAnimationOptionCalculationModeDiscrete   //運算模式 :離散
UIViewKeyframeAnimationOptionCalculationModePaced      //運算模式 :均勻執(zhí)行
UIViewKeyframeAnimationOptionCalculationModeCubic      //運算模式 :平滑
UIViewKeyframeAnimationOptionCalculationModeCubicPaced //運算模式 :平滑均勻

增加關(guān)鍵幀的方法:

 [UIView addKeyframeWithRelativeStartTime:(double)//動畫開始的時間(占總時間的比例)
                         relativeDuration:(double) //動畫持續(xù)時間(占總時間的比例)
                               animations:^{
                             //執(zhí)行的動畫
 }];
  1. 轉(zhuǎn)場動畫

4.1 從舊視圖轉(zhuǎn)到新視圖的動畫效果

 [UIView transitionFromView:(nonnull UIView *)
                     toView:(nonnull UIView *)
                   duration:(NSTimeInterval)
                    options:(UIViewAnimationOptions)
                 completion:^(BOOL finished) {
                     //動畫執(zhí)行完畢后的操作
 }];

在該動畫執(zhí)行過程中,fromView會從父視圖移除,并將toView添加到父視圖中犯眠,該轉(zhuǎn)場動畫作用對象是父視圖按灶。(也就是說過渡動畫體現(xiàn)在父視圖上面)

調(diào)用該方法相當(dāng)于調(diào)用下面兩個方法:

[fromView.superview addSubview:toView];
[fromView removeFromSuperview];

4.2 單個視圖的過渡動畫

 [UIView transitionWithView:(nonnull UIView *)  //動畫作用的對象
                   duration:(NSTimeInterval)     //動畫執(zhí)行時間
                    options:(UIViewAnimationOptions)   //動畫過渡效果
                 animations:^{
                 //執(zhí)行的動畫
 }
                 completion:^(BOOL finished) {
                 //動畫執(zhí)行完畢后的操作
 }];

示例演示

  1. 改變frame位置

- (void)blockAnimation1{
    [UIView animateWithDuration:1 animations:^{
        self.giftView.frame = self.heartView.frame;
    }completion:^(BOOL finished) {
        NSLog(@"執(zhí)行完畢");
    }];
}


- (void)blockAnimation2{
    [UIView animateWithDuration:0.5 delay:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.giftView.frame = self.heartView.frame;
    } completion:^(BOOL finished) {
        NSLog(@"執(zhí)行完畢");
    }];
}
  

動畫效果:


asda.gif
  1. 阻尼動畫
- (void)blockAni1{
    [UIView animateWithDuration:1 delay:1 usingSpringWithDamping:0.5 initialSpringVelocity:5.0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.giftView.frame = self.heartView.frame;
    } completion:^(BOOL finished) {
        NSLog(@"執(zhí)行結(jié)束");
    }];  
}

動畫效果:

asda.gif
  1. Keyframes
    這里以顏色變化為例,演示關(guān)鍵幀動畫
- (void)blockAni2{
    self.giftView.image = nil;
    
    [UIView animateKeyframesWithDuration:9.0 delay:0.f options:UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{
        [UIView addKeyframeWithRelativeStartTime:0.f relativeDuration:1.0 / 4 animations:^{
            self.giftView.backgroundColor = [UIColor colorWithRed:0.9475 green:0.1921 blue:0.1746 alpha:1.0];
        }];
        [UIView addKeyframeWithRelativeStartTime:1.0 / 4 relativeDuration:1.0 / 4 animations:^{
            self.giftView.backgroundColor = [UIColor colorWithRed:0.1064 green:0.6052 blue:0.0334 alpha:1.0];
        }];
        [UIView addKeyframeWithRelativeStartTime:2.0 / 4 relativeDuration:1.0 / 4 animations:^{
            self.giftView.backgroundColor = [UIColor colorWithRed:0.1366 green:0.3017 blue:0.8411 alpha:1.0];
        }];
        [UIView addKeyframeWithRelativeStartTime:3.0 / 4 relativeDuration:1.0 / 4 animations:^{
            self.giftView.backgroundColor = [UIColor colorWithRed:0.619 green:0.037 blue:0.6719 alpha:1.0];
        }];
    } completion:^(BOOL finished) {
        NSLog(@"動畫結(jié)束");
    }];
    
}

動畫效果


asda.gif
  1. 轉(zhuǎn)場動畫

4.1 單個視圖的過渡效果

- (void)blockAni3{
    [UIView transitionWithView:self.giftView duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        self.giftView.image = [UIImage imageNamed:@"local_2"];
    } completion:^(BOOL finished) {
        NSLog(@"動畫結(jié)束");
    }];
}

執(zhí)行效果


asda.gif

將枚舉值換為UIViewAnimationOptionTransitionFlipFromLeft的執(zhí)行效果為:

asda.gif

4.2 從舊視圖轉(zhuǎn)到新視圖的動畫效果

//轉(zhuǎn)場動畫 從舊視圖轉(zhuǎn)到新視圖的動畫效果
- (void)blockAni4{
    UIImageView * newCenterShow = [[UIImageView alloc]initWithFrame:self.giftView.frame];
    newCenterShow.image = [UIImage imageNamed:@"local_2"];
    [UIView transitionFromView:self.giftView toView:newCenterShow duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
        NSLog(@"動畫結(jié)束");
    }];
}

該動畫作用的是父視圖筐咧,動畫效果如下:


asda.gif

本文文章以及代碼鸯旁,參考了iOS動畫篇:UIView動畫噪矛,所有代碼和動畫我都驗證過,截圖是我自己做的铺罢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艇挨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子韭赘,更是在濱河造成了極大的恐慌缩滨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泉瞻,死亡現(xiàn)場離奇詭異脉漏,居然都是意外死亡,警方通過查閱死者的電腦和手機袖牙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門侧巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鞭达,你說我怎么就攤上這事司忱。” “怎么了碉怔?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵烘贴,是天一觀的道長。 經(jīng)常有香客問我撮胧,道長桨踪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任芹啥,我火速辦了婚禮锻离,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘墓怀。我一直安慰自己汽纠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布傀履。 她就那樣靜靜地躺著虱朵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钓账。 梳的紋絲不亂的頭發(fā)上碴犬,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音梆暮,去河邊找鬼服协。 笑死,一個胖子當(dāng)著我的面吹牛啦粹,可吹牛的內(nèi)容都是我干的偿荷。 我是一名探鬼主播窘游,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼跳纳!你這毒婦竟也來了忍饰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤棒旗,失蹤者是張志新(化名)和其女友劉穎喘批,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铣揉,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡饶深,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逛拱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敌厘。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖朽合,靈堂內(nèi)的尸體忽然破棺而出俱两,到底是詐尸還是另有隱情,我是刑警寧澤曹步,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布宪彩,位于F島的核電站,受9級特大地震影響讲婚,放射性物質(zhì)發(fā)生泄漏尿孔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一筹麸、第九天 我趴在偏房一處隱蔽的房頂上張望活合。 院中可真熱鬧,春花似錦物赶、人聲如沸白指。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽告嘲。三九已至,卻和暖如春奖地,著一層夾襖步出監(jiān)牢的瞬間状蜗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工鹉动, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宏邮。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓泽示,卻偏偏與公主長得像缸血,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子械筛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • UIView動畫簡介 UIView動畫實質(zhì)上是對Core Animation的封裝捎泻,提供簡潔的動畫接口。 UIVi...
    th先生閱讀 193評論 0 0
  • 概述 在AppStore中的應(yīng)用越來越重視動畫效果的使用,一個良好動畫效果可以讓兩個狀態(tài)之間平滑地過度,也可以利用...
    蚊香醬閱讀 5,444評論 3 58
  • UIView動畫簡介# UIView動畫實質(zhì)上是對Core Animation的封裝埋哟,提供簡潔的動畫接口笆豁。 UIV...
    boundlessocean閱讀 407評論 0 0
  • 花了將近一周的時間去學(xué)習(xí)ios動畫闯狱,因為對于一個ios開發(fā)者來說,動畫內(nèi)容絕對是一門必修課抛计。聽了不少課哄孤,也看了不少...
    ChinaSwift閱讀 1,901評論 2 35
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險吹截,但是人生放棄了冒險瘦陈,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,033評論 0 4