CABasicAnimation - 基本動畫

来源:http://www.cnblogs.com/xs514521/archive/2016/02/16/5192378.html
-Advertisement-
Play Games

嗷嗚嗷嗚嗷嗚 1 // 將視圖作為屬性方便後面執行多個不同動畫 2 _myView = [[UIView alloc] init]; 3 _myView.layer.position = CGPointMake(100, 100); 4 _myView.layer.bounds = CGRectMa


嗷嗚嗷嗚嗷嗚

1 // 將視圖作為屬性方便後面執行多個不同動畫
2 _myView = [[UIView alloc] init];
3 _myView.layer.position = CGPointMake(100, 100);
4 _myView.layer.bounds = CGRectMake(0, 0, 100, 100);
5 _myView.backgroundColor = [UIColor blueColor];
6 [self.view addSubview:_myView];
7 [_myView release];

 

 1 // 創建一個CABasicAnimation類型的動畫對象並對CALayer的position屬性執行動畫
 2 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
 3 
 4 // 動畫持續1.5s
 5 anim.duration = 1.5;
 6 
 7 // position屬性值從(50, 80)漸變到(300, 350)
 8 anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)];
 9 anim.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 350)];
10 
11 // 設置動畫的代理
12 anim.delegate = self;
13 
14 // 保持動畫執行後的狀態
15 anim.removedOnCompletion = NO;
16 anim.fillMode = kCAFillModeForwards;
17 
18 // 添加動畫對象到myView的圖層上
19 [_myView.layer addAnimation:anim forKey:@"translate"];
  • 上面實現了平移動畫
  • 想要實現不同的效果,最關鍵的地方就是第2行CABasicAnimation對象的初始化方法中keyPath的設定。在iOS中有不同的keyPath可以查看API文檔搜索

    CABasicAnimation animationWithKeyPath Types

  • 第8、9行這裡的屬性接收的是id類型的參數所以不能直接使用CGPoint這種結構體類型,而是要先包裝成NSValue對象後再使用。
  • 註意:可以嘗試將第9行的toValue換成byValue  區別:前者是到指定的位置,後者是在當前的位置上增加多少

  • 預設情況下,動畫執行完畢後,動畫會自動從CALayer上移除,CALayer又會回到原來的狀態。為了保持動畫執行後的狀態,可以加入第15、16行代碼

    fillMode的作用就是決定當前對象過了非active時間段的行為。比如動畫開始之前,動畫結束之後。如果是一個動畫CAAnimation,則需要將其removedOnCompletion設置為NO,要不然fillMode不起作用.

    kCAFillModeRemoved 預設值 也就是說當動畫開始前和動畫結束後,動畫對layer都沒有影響,動畫結束後,layer會恢復到之前的狀態 
    kCAFillModeForwards 當動畫結束後,layer會一直保持著動畫最後的狀態 
    kCAFillModeBackwards 這個和kCAFillModeForwards是相對的,就是在動畫開始前,你只要將動畫加入了一個layer,layer便立即進入動畫的初始狀態並等待動畫開始.你可以這樣設定測試代碼,將一個動畫加入一個layer的時候延遲5秒執行.然後就會發現在動畫沒有開始的時候,只要動畫被加入了layer,layer便處於動畫初始狀態 
    kCAFillModeBoth 理解了上面兩個,這個就很好理解了,這個其實就是上面兩個的合成.動畫加入後開始之前,layer便處於動畫初始狀態,動畫結束後layer保持動畫最後的狀態.

  • 第19行後面的@"translate"只是給動畫對象起了個名稱,也可以直接給個nil,但是為方便以後可以調用CALayer的removeAnimationForKey:方法根據動畫名稱來移除相應的動畫
  • 第12行後面的self是視圖控制器。代理需要實現的方法:
 1 #pragma mark -----動畫開始-----
 2 - (void)animationDidStart:(CAAnimation *)anim {
 3 NSLog(@"動畫開始了");
 4 }
 5 
 6 #pragma mark -----動畫結束-----
 7 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
 8 // 查看一下動畫執行完畢後的position值
 9 NSString *string = NSStringFromCGPoint(_myView.layer.position);
10 NSLog(@"動畫結束了,position:%@", string);
11 }

 在實質上,圖層的屬性值還是動畫執行前的初始值,並沒有真正被改變。

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 1;

CATransform3D form = CATransform3DMakeTranslation(350, 350, 0);
anim.toValue = [NSValue valueWithCATransform3D:form];

[_myView.layer addAnimation:anim forKey:nil];

 

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"];
anim.duration = 2;

anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)];

[_myView.layer addAnimation:anim forKey:nil];

 

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 1.5; // 動畫持續1.5s

// CALayer的寬度從0.5倍變為2倍
// CALayer的高度從0.5倍變為1.5倍
anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1)];
anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)];

[_myView.layer addAnimation:anim forKey:nil];


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

-Advertisement-
Play Games
更多相關文章
  • 如下是快速索引的效果圖,是從網上下的實例。如圖實現的難點1:是最右側的索引是用自定義View來實現的,主要通過onDraw的方法將其畫出; 難點2:是如何拿到每個名字的首字母用的是pinyin4j-2.5.0.jar 將漢字轉化成拼音再去第一個字元;難點3:ListView的adapte不好實現 下
  • Android的存儲系統(一) 看了很長時間Vold存儲模塊的相關知識,也死扣了一段時間的Android源碼,發現Android存儲系統所涉及的函數調用,以及Kernel與上層之間的Socket傳輸真的是讓人頭疼,除了需要整理整個架構的原理以外,還要反覆看源碼,真真的鬱悶。 鬱悶之餘,還是打算把自己
  • 1.ERROR:--90096 :原因是:啟動圖的問題; 解決 :添加一張名字是 [email protected] 的啟動圖; 2.ERROR:--90535 :原因是:導入的第三方的問題; 解決 :刪除第三方包中的info.plist里的Executable file 這一行;
  • 在開發過程中,經常會需要處理一組不同類型的數據,比如學生的個人信息,由姓名、年齡、性別、身高等組成,因為這些數據是由不同數據類型組成的,因此不能用數組表示,對於不同數據類型的一組數據,可以採用結構體來進行存儲。當然,對於面向對象的語言來說,最好是用類來表示,但是C語言是面向過程的,因此選擇用結構體來
  • 在開始前我們在這先附一段最簡單的代碼 - (void)viewDidLoad { [super viewDidLoad]; UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; UICollec
  • 開通博客以來已經約莫1個月了。幾次想提筆寫寫東西,但總是由於各種各樣的原因並沒有開始。現在,年假剛結束,項目也還沒有開始,但最終促使我寫這篇博客的是,看了一篇博友寫的新年計劃,說是要在新的一年中寫50篇博客,我也心血來潮的定下了這樣的目標。把年前項目中用到的FragmentTabHost在這裡總結一
  • 需求:在一個數組裡面,將在這個數組中的並且在另一個數組裡面的元素過濾掉。 即:在一個數組dataArray裡面,將在dataArray數組中的並且在filteredArray數組裡面的元素過濾掉。 //iOS-篩選數組內的元素 //在dataArray中裡面,將在dataArray中的並且在filt
  • 今天早上同事說咱們的證書無法使用了,顯示“此證書的簽發者無效”。一開始以為誰誤操作了證書,查看後發現所有證書都無效了。查了會才發下原來是Apple Worldwide Developer Relations Certification Authority Intermediate Certifica
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...