iOS:動畫

来源:http://www.cnblogs.com/leonlincq/archive/2017/08/22/7412463.html
-Advertisement-
Play Games

1、UIView Animation 1-1)、原始的,非Block。 1-2)、Block 2、Transition(轉場動畫) 2-1)、原始的 2-2)、封裝過的,簡潔,用UIView Animation,View的方法,非Layer 2-3)、VC自帶的模態視圖轉場動畫 ...


目錄

  1、UIView Animation

  2、Transition(轉場動畫)

  ...

  N、粒子動畫

 

1、UIView Animation

  1-1)、原始的,非Block。

//動畫名、內容
[UIView beginAnimations:@"id100" context:@"animation1"];
//時長2秒
[UIView setAnimationDuration:2.0];	
//動畫速度
//    UIViewAnimationCurveEaseInOut,  // 慢入、慢出
//    UIViewAnimationCurveEaseIn,     // 慢入
//    UIViewAnimationCurveEaseOut,    // 慢出
//    UIViewAnimationCurveLinear,     // 勻速
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];	
//設置代理
[UIView setAnimationDelegate:self];
//動畫將要開始SEL
[UIView setAnimationWillStartSelector:@selector(animationWillStart:context:)];	
//動畫將要結束SEL
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
//提交動畫
[UIView commitAnimations];

//簽代理後,才能實現SEL的方法(方法名隨意,參數個數也隨意,分別少於2/3個的時候,只收到前面幾個參數,多於它的參數,後面參數空,有用過C的回調函數,應該會比較熟悉)
//開始動畫時的方法
-(void)animationWillStart:(NSString *)animationID context:(void *)context
{
    NSLog(@"動畫開始");
}
//結束動畫時的方法
-(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    //可以判斷ID,做連續動畫
    NSLog(@"動畫結束");
}
//自己取名
-(void)theAnimationStop:(NSString *)animationID thecontext:(void *)theContext context:(void *)context2
{
NSLog(@"%@,%@,%@",animationID,theContext,context2);
}    

  1-2)、Block

//嵌套,做連續動畫
[UIView animateWithDuration:2.0 animations:^{

    self.cyanVIew.frame = CGRectMake(100, 400, 100, 100);

} completion:^(BOOL finished) {

    [UIView animateWithDuration:2.0 animations:^{

        self.cyanVIew.frame = CGRectMake(100, 100, 100, 100);

    }];

}];

 

2、Transition(轉場動畫)

  2-1)、原始的

//創建
CATransition *animation = [CATransition animation];
//動畫時間
animation.duration = 1.5;
//動畫類型
//    kCATransitionFade           //淡入
//    kCATransitionMoveIn         //覆蓋
//    kCATransitionPush           //推
//    kCATransitionReveal         //掀起,相對覆蓋
//以下為私有API
//    @"cube"                     //立方體(某寶的AR切換)
//    @"suckEffect"               //吮吸
//    @"oglFlip"                  //翻轉(某信,好友歷史說說,查看詳情)
//    @"rippleEffect"             //波紋
//    @"pageCurl"                 //日曆上翻
//    @"pageUnCurl"               //日曆下蓋
//    @"cameraIrisHollowOpen"     //相機打開
//    @"cameraIrisHollowClose"    //相機關閉
animation.type = @"cube";
//動畫方向
//    kCATransitionFromRight      //從右邊
//    kCATransitionFromLeft       //從左邊
//    kCATransitionFromTop        //從上面
//    kCATransitionFromBottom     //從下麵
animation.subtype = kCATransitionFromLeft;
//動畫速度(慢入、慢出)
//    kCAMediaTimingFunctionLinear        //勻速
//    kCAMediaTimingFunctionEaseIn        //慢入
//    kCAMediaTimingFunctionEaseOut       //慢出
//    kCAMediaTimingFunctionEaseInEaseOut //慢入慢出
//    kCAMediaTimingFunctionDefault       //勻速,不過有點快
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
//代理
//- (void)animationDidStart:(CAAnimation *)anim;
//- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
animation.delegate = self;

//1、添加動畫到導航欄
[self.navigationController.view.layer addAnimation:animation forKey:@"animation"];
[self.navigationController pushViewController:vc animated:NO];

//2、添加動畫到普通的View
[bgView.layer addAnimation:animation forKey:@"animation"];
//把最上面的View放到最底層,一般轉場可能就2層相互轉換,也可用exchangeSubviewAtIndex:withSubviewAtIndex:
[bgView sendSubviewToBack:[[bgView subviews] lastObject]];

  2-2)、封裝過的,簡潔,用UIView Animation,View的方法,非Layer

//參數cache,YES為截圖後再轉場,減輕系統負擔,動畫更流暢,NO為一起動畫,如需要邊轉場邊動畫的效果

//     UIViewAnimationTransitionNone,
//     UIViewAnimationTransitionFlipFromLeft,     //左邊下翻效果(X信,好友歷史說說,查看詳情)
//     UIViewAnimationTransitionFlipFromRight,    //右邊下翻效果
//     UIViewAnimationTransitionCurlUp,           //上翻日曆效果
//     UIViewAnimationTransitionCurlDown,         //下蓋日曆效果

//1、導航欄轉場
[UIView animateWithDuration:2.0 animations:^{
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:YES];
    [self.navigationController pushViewController:vc animated:NO];
}];

//2、普通View轉場,把當前View放在最底層,最好大小全相同,不然動畫效果很尷尬
[UIView animateWithDuration:2.0 animations:^{
    //轉場動畫
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:bgView cache:YES];
    //最上面的View放到最下麵
    [bgView sendSubviewToBack:[[bgView subviews] lastObject]];
}];

  2-3)、VC自帶的模態視圖轉場動畫

//設置模態視圖的轉場效果(如X信,朋友的歷史單條說說,點擊查看詳細)。
second.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
//推
[self presentViewController:second animated:YES completion:^{
}];

  

 

 

 

N、粒子動畫

  N-0)、寫在前面

    粒子發射層 繼承CALayer,那麼陰影、邊界、圓角的屬性都有。

    y軸/x軸速度 小於 加速度(重力) 會有 雪花/風力 效果(cell.velocity < cell.yAcceleration)。

    y軸速度 稍大於 加速度(重力) 會有 發射/投擲 效果(cell.velocity > cell.yAcceleration)。

    粒子發射層 設為疊加模式會有火焰效果(emitterLayer.renderMode = kCAEmitterLayerAdditive)。

    粒子的名字。可以用KVC來設置屬性([emitterLayer setValue:[NSNumber numberWithFloat:M_PI] forKey:@"emitterCells.test2.emissionLongitude"];)。

    粒子縮放速度。當縮放到0的時候,又會放大,所以想要從birth到lifetime結束都是縮放形式,就需要不斷調值,不要縮放太快(cell.scaleSpeed)。

    粒子包含粒子。顏色,速度之類的都會疊加,會有意想不到的效果(emitterLayer.emitterCells = @[cell]; cell.emitterCells = @[cell2];)。

    粒子的形狀、模型 emitterShape、emitterMode 搞了很久沒搞懂。多虧這邊文章( http://www.cnblogs.com/densefog/p/5424155.html )

  N-1)、創建粒子發射層

    //創建 粒子發射器層layer
    emitterLayer = [CAEmitterLayer layer];
    //發射器 frame(可設置合適大小來 masksToBounds )
    emitterLayer.frame = self.view.bounds;
    //發射器 發射源起點
    emitterLayer.emitterPosition = CGPointMake(emitterLayer.frame.size.width / 2.0, emitterLayer.frame.size.height/ 2.0);
    //發射器 發射源size
    emitterLayer.emitterSize = CGSizeMake(100.0, 100.0);
    //混合方式(Add是疊加,有火焰效果,其他覆蓋)
//    kCAEmitterLayerUnordered    //無序
//    kCAEmitterLayerOldestFirst  //老的在(數組)最前面(顯示最下層)
//    kCAEmitterLayerOldestLast   //老的在(數組)最後面(顯示最上層)
//    kCAEmitterLayerBackToFront  //
//    kCAEmitterLayerAdditive     //疊加
    emitterLayer.renderMode = kCAEmitterLayerOldestLast;
    //是否開啟超三維空間模式(NO慢慢變白透明消失,YES直接透明消失)
    emitterLayer.preservesDepth = YES;
    //發射器形狀
//    kCAEmitterLayerPoint        //發射源一個點,位置來源(emitterPosition)
//    kCAEmitterLayerLine         //發射源一條線,位置來源(emitterSize,正中的橫線)
//    kCAEmitterLayerRectangle    //發射源一個矩形,位置來源(emitterSize)
//    kCAEmitterLayerCuboid       //發射源一個立方體,位置來源(emitterSize + emitterZPosition)
//    kCAEmitterLayerCircle       //發射源一個圓形,位置來源(emitterSize 的內切圓)
//    kCAEmitterLayerSphere       //發射源一個立體圓形,位置來源(emitterSize + emitterZPosition的內切圓)
    emitterLayer.emitterShape = kCAEmitterLayerPoint;
    //發射模型
//    kCAEmitterLayerPoints       //發射模型一個點
//    kCAEmitterLayerOutline      //發射模型外框邊界
//    kCAEmitterLayerSurface      //發射模型矩陣裡面
//    kCAEmitterLayerVolume       //
    emitterLayer.emitterMode = kCAEmitterLayerPoints;
    //發射Z軸起點
    emitterLayer.emitterZPosition = 50.0;
    //發射器的深度
    emitterLayer.emitterDepth = 50.0;
    //在一開始生成隨機的粒子數?(暫時看不出效果)
    emitterLayer.seed = 80;
    //添加到layer層
    [self.view.layer addSublayer:emitterLayer];

  N-2)、創建粒子

    //創建 粒子
    CAEmitterCell *cell = [[CAEmitterCell alloc] init];
    //粒子 名稱
    cell.name = @"test";
    //粒子 圖片
    cell.contents = (__bridge id _Nullable)([UIImage imageNamed:@"2"].CGImage);
    //粒子 y軸加速度(重力)
    cell.yAcceleration = 75.f;//-50.f;
    //粒子 x軸加速度(重力)
    cell.xAcceleration = 0.f;
    //粒子 生成速率(/秒,>1.0)
    cell.birthRate = 1;
    //粒子 生命周期
    cell.lifetime = 5.0;
    //粒子 顏色
    cell.color = [UIColor colorWithRed:1 green:0.5 blue:0.1 alpha:1.0].CGColor;
    //粒子 透明速度(-0.0 <-> -1.0,-0.9消失得快,-0.1消失得慢)
    cell.alphaSpeed = -0.1;
    //粒子 運動的速度
    cell.velocity = 50;
    //粒子 運動的速度範圍(velocity +- Range/2 )
    cell.velocityRange = 50;
    //粒子旋轉角度(0 - Range)
    cell.spin = 0;
    //粒子旋轉角度範圍(0 - Range)
    cell.spinRange = 0;
    //粒子 縮放
    cell.scale = 1;
    //粒子 縮放速度(-1 <-> 1 ,-變小 +變大,煙花爆炸後效果,如果變小到0又會增大,值需要調試)
    cell.scaleSpeed = -0.5;
    //粒子 發射角度
    cell.emissionLongitude = (M_PI/2)*3;
    //粒子 發射角度範圍(Longitude +- Range/2 )
    cell.emissionRange = M_PI/2;
    //顏色變換範圍
//    cell.greenRange = 1.0;
//    cell.redRange = 1.0;
//    cell.blueRange = 1.0;
    //顏色變換速度
//    cell.redSpeed =-1.5;
//    cell.blueSpeed =+1.5;
//    cell.greenSpeed =+1.0;

  N-3)、添加粒子到發射層

//單個粒子動畫
emitterLayer.emitterCells = @[cell];

//多個粒子同時動畫
emitterLayer.emitterCells = @[cell,cell2];

//粒子動畫包含粒子動畫(裂變的感覺)
emitterLayer.emitterCells = @[cell];
cell.emitterCells = @[cell2];
cell2.emitterCells = @[cell3];

 

註:

  在第三種情況,控制好 lifebirthRate 和 lifetime ,可以達到煙花效果。

  比如cell是發射效果(這裡設為1個/秒吧)、cell3是爆炸效果(幾十、幾百個/秒),如果,cell3加在cell上,效果就像彗星移動(cell移動的過程中,cell3不斷生成)。

  那麼要實現發射效果,就要加個緩存層cell2。cell的生命周期(N秒) 和cell2的生成率(1個/N秒)一樣 ,cell剛消失,cell2才產生。不過因為 lifebirthRate >= 1 。所以目前只有1秒符合。

cell.lifebirthRate = 隨意
cell.lifetime = 1.0 + ?;

cell2.lifebirthRate = 1.0;
cell2.lifetime = 1.0 + ?;

cell2的圖片可以空,等到cell快消失前,生成一個cell2,同時cell2包含的cell3一秒幾十、幾百個生成,就是發射爆炸效果了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近學習瞭如何在Android 6.0上添加一個系統服務,APP如何通過新增的系統服務訪問底層驅動。在這學習過程中,收穫頗多,並結合學習了《Embeded Android》--Karim Yaghmour 一書中的Appendix B. Adding Support For New Hardware ...
  • 代碼很簡單,一看便知。這裡為順時針,若想要逆時針,clockwise改為0,還需更改起始角度和終點角度。 源碼地址:https://github.com/LfyDragon/CountDown 直接上代碼:- (void)drawRect:(CGRect)rect { ...
  • activity_main.xml中的配置 MainActivity中代碼: ...
  • 期初第一次做藍牙開鎖的時候遇到的最尖銳的問題就是ios設備如何對獲取的廣播信息進行讀取,大概用了4中方式,都無法解決,最後不得不求助官方人員。給了一個方法,大家可以參考。在此附圖: 由於mac地址是65::43:53這種形式,所以截取方式就如上 ...
  • 一,效果圖。 二,代碼。 ViewController.m ...
  • 一、前言 在開發過程中,Android可能會打出來很多的包,用於標識不同的商店下載量。原來覺得蘋果只有一個商店:AppStore,如何做出不同來源的統計呢?本篇文章就是告訴大家如何做不同渠道來源統計。 二、正文 先看一下蘋果自家統計到的數據: 這個是在沒有對下載鏈接做任何處理的情況下在itunesc ...
  • 一、前沿||潛心修心,學無止盡。生活如此,coding亦然。本人鳥窩,一隻正在求職的鳥。聯繫我可以直接微信:jkxx123321 二、項目總結 **||**文章參考資料:1. http://blog.csdn.net/u011272795/article/details/73824558 2.htt ...
  • 假如B類繼承A類,數據中有B類,把B類轉Data後存入,再取出。由於Model聲明的類型是A,那轉出來的也是A類型,這樣數據就丟失了一部分。 或者存入的是範型集合數據,存入再取出也會發生類型擦除。 原因在於對類對象進行序列化和反序列化時,很多第三方庫只是單純以Model聲明的類型為準,沒有處理類型擦 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...