国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

CAMediaTiming ( 時間協(xié)議)詳解及實例代碼

2020-07-26 03:02:32
字體:
供稿:網(wǎng)友

CAMediaTiming ( 時間協(xié)議)詳解

有一種通過CAAnimation實現(xiàn)的協(xié)議叫做CAMediaTiming,也就是CABasicAnimation和CAKeyframeAnimation的基類(指CAAnimation)。像duration,beginTime和repeatCount這些時間相關的屬性都在這個類中。大體而言,協(xié)議中定義了8個屬性,這些屬性通過一些方式結(jié)合在一起,準確的控制著時間。文檔中每個屬性只有幾句話,所以很有可能在看這篇文章之前你都已經(jīng)讀過了,但是我覺得使用可視化的圖形能更好的解釋時間。

可視化的CAMediaTiming

為了顯示相關屬性的不同時間,無論是他們自己還是混合狀態(tài),我都會動態(tài)的將橙色變?yōu)樗{色。下面的塊狀顯示了從開始到結(jié)束的動畫過程,時間線上每一個標志代表一秒鐘。你可以看到時間線上的任意一點,當前顏色即表示動畫中的當前時間。比如,duration像下面一樣可視。

我們都知道,CALayer和CAAnimation都實現(xiàn)了CAMediaTiming 協(xié)議,因此在Core Animation中,理解CAMediaTiming協(xié)議中的屬性是非常必要的,但是蘋果的文檔中對于各個屬性描述太簡單,對初學者容易理解,這篇文章主要幫助理解CAMediaTiming協(xié)議中各個屬性的含義。

CAMediaTiming Protocol提供了8個屬性,下面將分別講解。

CAMediaTiming / 時間協(xié)議

  1. repeatCount,動畫的重復次數(shù),可以設置為小數(shù)。設置為HUGE_VALF,表示無限重復。
  2. repeatDuration,動畫總時長,如果大于單次時長,則重復;如果小于單次時長,則截斷。
  3. duration,單次動畫時長。
  4. speed,圖層或動畫模型相對于父圖層CALayer的時間流逝速度。
  5. fillMode,有效期結(jié)束后,動畫對象的呈現(xiàn)效果是凍結(jié)還是移除。
  6. beginTime,相對于父對象的開始時間。注意,以系統(tǒng)的絕對時間為準。例如:
/**當前時間2秒以后開始動畫*/keyFrameAnim.beginTime = CACurrentMediaTime() + 2;/**截止到當前時間,動畫已經(jīng)執(zhí)行了2秒,注意,如果執(zhí)行的時間大于動畫時長,則表示動畫已經(jīng)執(zhí)行過。*/keyFrameAnim.beginTime = CACurrentMediaTime() - 2;

7.timeOffset,時間軸偏移量。將時間軸移動至偏移位置,再執(zhí)行整個動畫時長。假設動畫時長3秒,偏移量為8,則開始位置為8 % 3 = 2,再執(zhí)行3秒,即在整個時長的1/ 3處結(jié)束。

8.CACurrentMediaTime,返回系統(tǒng)當前的絕對時間(從本次開機開始),單位秒。

 /** The receiver does not appear until it begins and is removed from the presentation when it is completed. */ kCAFillModeRemoved; // (默認)動畫模型的呈現(xiàn)效果直至開始時才顯示,并在動畫結(jié)束后移除。 /** The receiver does not appear until it begins but remains visible in its final state when it is completed. */ kCAFillModeForwards; // 動畫模型的呈現(xiàn)效果直至開始時才顯示,但在動畫結(jié)束后仍然顯示最后的狀態(tài)。 /** The receiver appears in its initial state before it begins but is removed from the presentation when it is completed. */ kCAFillModeBackwards; // 動畫開始之前,動畫模型顯示其初始呈現(xiàn)效果,但在動畫結(jié)束后移除。 /** The receiver appears in its initial state before it begins and remains visible in its final state when it is completed. */ kCAFillModeBoth; // 動畫開始之前,動畫模型顯示其初始呈現(xiàn)效果,并且在動畫結(jié)束后仍然顯示最后的狀態(tài)。

暫停/繼續(xù)動畫demo

- (IBAction)pauseBtnClicked:(id)sender {  /**   判斷當前圖層對象是否有針對postion屬性的動畫效果   */  if ([self.layer.presentationLayer animationForKey:@"position"]) {    // 通過絕對時間獲取圖層的本地時間    CFTimeInterval localTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];    /**     將圖層的時間流逝速度設置為0,以暫停動畫     */    self.layer.speed = 0;    // 設置圖層的時間軸偏移量,為繼續(xù)動畫做準備    self.layer.timeOffset = localTime;  }}- (IBAction)continueBtnClicked:(id)sender {  /**   判斷當前圖層對象是否有針對postion屬性的動畫效果   */  if ([self.layer.presentationLayer animationForKey:@"position"]) {    // 獲取上次暫停時的時間軸偏移量    CFTimeInterval timeOffset = self.layer.timeOffset;    // 重置時間軸偏移量    self.layer.timeOffset = 0;    // 速度還原為1    self.layer.speed = 1;    // 重置開始時間#warning 此處嚴重不理解。    self.layer.beginTime = 0;    // 計算暫停時間和當前時間的差值    CFTimeInterval localTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];    CFTimeInterval timeSincePause = localTime - timeOffset;    // 從上一次暫停處開始    self.layer.beginTime = timeSincePause;  }}

感謝閱讀,希望能幫助到大家,謝謝大對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 灵寿县| 桐柏县| 滦平县| 托克托县| 博野县| 五指山市| 新晃| 平武县| 崇义县| 沧源| 淮滨县| 砚山县| 兰州市| 景谷| 阆中市| 响水县| 锦州市| 介休市| 法库县| 红桥区| 于田县| 安吉县| 肃南| 衡东县| 鸡东县| 榆林市| 江都市| 芜湖市| 呼玛县| 济宁市| 若尔盖县| 阿鲁科尔沁旗| 山西省| 连城县| 江陵县| 博罗县| 陈巴尔虎旗| 福州市| 黔江区| 东乌| 吉林省|