關于iOS里的做動畫方法的差別與注意事項

CoreAnimation與UIView.animation...

這兩個方式的主要差別在于,前者如果不主動設置,那么在動畫做完以后,會恢復原狀。
后者則不會,動畫做完后是什么樣,控件就是什么樣。

UIView.animation...是什么

首先我們來做一個動畫

UIView.animate(withDuration: 5, animations: {self.moveView.frame.origin.y += 200
})

這個動畫是讓moveView在Y軸上移動200個點。

  1. 我們在動畫代碼前,打印一下這個控件的frame信息 (155.0, 140.0, 64.0, 64.0)
  2. 然后我們在動畫開始2秒和動畫結束時打印一下frame信息,讓人疑惑的是結果都為 (155.0, 340.0, 64.0, 64.0)
  3. 我們先停一下,去看看CoreAnimation

CoreAnimation

使用CA動畫時,主要是使用的CAAnimation的子類(下面簡稱 anim )。
anim 是添加到Layer上的,你可以在layer上訪問添加到該layer的 anim 。好的,現在我們做一個和上面一樣的Y軸上的位移動畫。

  1. 在動畫開始后的2秒打印一下frame和layer.frame信息,都是 (155.0, 140.0, 64.0, 64.0)
  2. 在2秒時打印animationKeys, Optional(["position"])
  3. 動畫結束后,控件恢復到了原狀,animationKeys為 nil
  4. 我們把anim改成動畫結束后保持結束時狀態再看看1-3點的信息
  5. frame和layer.frame信息,也還都是 (155.0, 140.0, 64.0, 64.0)
  6. 在2秒時打印animationKeys, Optional(["position"])
  7. 動畫結束后,控件恢復到了原狀,animationKeys為 Optional(["position"])
  8. 此時我們使用Xcode的視圖調試工具查看,控件位置在 (155.0, 140.0, 64.0, 64.0) ,并且調試界面的位置和APP上的位置完全不一樣。

CoreAnimation動畫的注意事項

怎么獲取正在移動時的位置呢,如果有一個需求是要拿到實際運動的位置,該怎么辦?
使用 presentation 屬性
在CA動畫里,所有的實時狀態都會反應到這個屬性返回的layer上,本體layer在動畫時會被 隱藏 !

  1. 現在我們根據剛才的 anim 動畫查看一下 presentation 的信息。
  2. 果然,控件位置的實時信息是反應在這個layer上的

回過來看UIView.animation...

我們在動畫進行時打印 presentation 的信息,打印的frame信息竟然能夠正確反應當前控件的位置情況。
我們再打印 animationKeys 信息看看, Optional(["position"])
我想答案已經呼之欲出了。 UIView.animation... 使用的是 CoreAnimation 在做動畫,只是細節對程序員隱藏了。

兩者的區別上需要注意的地方

但是還有一個問題,剛才的打印結果,_UIView.animation..._ 結束后,frame信息為 (155.0, 340.0, 64.0, 64.0) ,而 anim 結束后為 (155.0, 140.0, 64.0, 64.0) ,但是 animpresentation 的frame卻是正確的。
這意味著你如果要在 anim 動畫后讓控件移動到正確的位置,你需要把控件的frame也設置到正確到位置,而不只是在 anim 上設置。
那什么時候設置是一個正確到時機呢?我們注意到,在開始做動畫到時候,屏幕上現實的視圖,實際上是顯示的 presentation 的信息,而不依賴于控件本身的layer。所以在做動畫前后都能去設置控件本身到正確的屬性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253390.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql-5.7 持久化統計信息詳解

一、持久化統計信息的意義: 統計信息用于指導mysql生成執行計劃,執行計劃的準確與否直接影響到SQL的執行效率;如果mysql一重啟 之前的統計信息就沒有了,那么當SQL語句來臨時,那么mysql就要收集統計信息然后再生成SQL語…

關于傳感器”英寸“計量

傳感器上的n是指對角線長度為16mm或18mm的n倍 以英寸代指的傳感器大小稱為靶面尺寸。 在CCD/CMOS出現之前,攝像機是利用一種叫作“光導攝像管(Vidicon Tube)”的成像器件感光成像的,這是一種特殊設計的電子管,其直徑的…

關于USB-AUDIO使用ALSA編程的一點問題

轉載自:http://blog.chinaunix.net/uid-25272011-id-3153434.html 最近在調試一款原相PAP7501攝像頭中的USB的麥克風,USB層走的應該是標準的UAC協議,具體可以見USB的官網:http://www.usb.org/developers/devclass_docs#approved&a…

讓input變成不可編輯狀態的方法

有時候&#xff0c;我們希望表單中的文本框是只讀的&#xff0c;讓用戶不能修改其中的信息&#xff0c;如使<input type"text" name"input1" value"中國"> 的內容&#xff0c;"中國"兩個字不可以修改。實現的方式歸納一下&#…

npm run dev 在本地調試出現跨域問題解決方法

npm run dev 在本地調試出現跨域問題 在localhost:8080調試時會出現跨域問題&#xff0c;如圖&#xff1a; 我的項目是用webpack作為前端自動化構建工具&#xff0c;可以在webpack-dev-server中配置跨域。webpack-dev-server是一個小型的nodejs服務器&#xff0c;是基于express…

alsa聲音編程介紹

http://blog.csdn.net/q553716434/article/details/7881552 period(周期):硬件中中斷間的間隔時間。它表示輸入延時。 聲卡接口中有一個指針來指示聲卡硬件緩存區中當前的讀寫位置。只要接口在運行&#xff0c;這個指針將循環地指向緩存區中的某個位置。 frame size sizeof(o…

五、python模塊以及包

模塊&#xff1a;編寫的別的程序中重用一些代碼。 1 模塊的寫法&#xff1a; 創建一個.py文件&#xff0c;該文件中包含函數與變量。使用撰寫python解釋器本身的本地語言來編寫模塊。比如使用C代碼編寫python模塊&#xff0c;并且在編譯后&#xff0c;可以通過標準的python解釋…

jeecg選擇按鈕帶入其他單據值

前端的標簽 <input class"inputxt" id"fshimian" name"fshimian" ignore"ignore" datatype"*" value"${shizhePage.fshimian}" /> <t:choose hiddenName"fshimian" hiddenid"fname"…

alsa編程

alsa 編程 分類&#xff1a; linux 2012-08-18 20:13 124人閱讀 評論(0) 收藏 舉報 編程parametersbufferloopsaccessplayback轉載自&#xff1a;http://blog.csdn.net/spygg/article/details/7824750 ALSA(Advanced Linux Sound Architecture)是由內核驅動,標準的API庫和一系…

Fiddler4入門——手機抓包

一、下載工具包 百度搜索”fiddler 下載“ &#xff0c;安裝最新版本 下載的軟件安裝包為“fiddler_4.6.20171.26113_setup.exe”格式&#xff0c;雙擊安裝。安裝成功&#xff0c;在“開始”-“所有程序”&#xff0c;就會看見這樣的圖標&#xff0c;若是常用的話&#xff0c;也…

Node.js Performance

https://blog.risingstack.com/node-js-performance-monitoring-with-prometheus/轉載于:https://www.cnblogs.com/skating/p/7544838.html

(五)DOM4j進行XML文件的解析及生成

DOM4j本身還是需要使用SAX建立解析器&#xff0c;然后通過文檔依次找到根節點&#xff0c;再通過根節點查找每一個節點的內容. 1.寫操作 import java.io.File;import java.io.FileOutputStream;import java.util.Iterator; import org.dom4j.Document;import org.dom4j.Documen…

Linux系統基礎.作業

要求以root用戶登錄系統&#xff0c;右擊桌面打開終端&#xff0c;查看當前登陸Linux系統所使用的用戶名 查看哪些用戶在系統上工作 修改當前時間為2018年8月26號11:28 查看2015年10月份日歷 使用兩種方法查看ls命令的使用說明 清除屏幕 ctrlL使用“useradd tom”命令新建tom用…

Alsa中PCM參數設置

分類&#xff1a; LINUX 1) PCM設備的句柄.2) 指定同時可供回放或截獲的PCM流的方向3) 提供一些關于我們想要使用的設置選項的信息,比如緩沖區大小,采樣率,PCM數據格式等4) 檢查硬件是否支持設置選項.4.1) 初始化PCM變量4.2) 分配hwparams結構4.3) 打開PCM設備4.4) 以聲卡的全部…

java5

java基礎&#xff08;五&#xff09;命名規則&#xff1a; 名字中只能包含->字母、_、數字、$&#xff0c;且開頭不能為數字包名必須都小寫文件名首字母和后面英文文件單詞首字母都要大寫變量和方法名 首字母小寫&#xff0c;后面英文單詞首字母大寫java中的方法&#xff1a…

最新歷史版本 :H.265

原來對264有深入的研究&#xff0c;現在想詳細了解下265啦&#xff0c;愿265盡快廣泛的使用起來&#xff0c;人們可以享受無處不在的視覺盛宴。 H.265是ITU-T VCEG 繼H.264之后所制定的新的視頻編碼標準。H.265標準圍繞著現有的視頻編碼標準H.264&#xff0c;保留原來的某些技術…

凱撒密碼、GDP格式化輸出、99乘法表

1.愷撒密碼的編碼 sinput(請輸入明文:) print(密文為:) for i in s:print(chr(ord(i)3),end)運行結果為&#xff1a; 2.國家名稱 GDP總量&#xff08;人民幣億元&#xff09; 中國 &#xffe5;765873.4375 澳大利亞 &#xffe5; 78312.4375 &#xff08;國家名稱左對齊&am…

【BZOJ3453】XLkxc [拉格朗日插值法]

XLkxc Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss]Description 給定 k,a,n,d,p  f(i)1^k2^k3^k......i^k  g(x)f(1)f(2)f(3)....f(x)  求(g(a)g(ad)g(a2d)......g(and))mod p Input 第一行數據組數&#xff0c;(保證小于6)  以下每行四個整數 …

hive安裝

雷頓學院大數據雷頓學院大數據&#xff1a;http://www.leidun.site/hive安裝下載hivehttp://mirror.bit.edu.cn/apache/hive/下載后解壓配置命令將hive加入命令vim ~/.bash_profile添加如下命令export HIVE_HOME/usr/local/Cellar/hive/1.2.1/libexec保存文件mysql數據庫驅動cu…

JavaFX常用匯總

1. 描述備注 1.1 參考教程 博客 易百教程 JavaFX中國 1.5 安裝 a). 在線安裝e(fx)clipse插件 b). 下載安裝SceneBuilder c). eclipse重啟以后,windows->preference->javaFx->SceneBuilder executable選擇 上一步中安裝后的exe文件 2. 快速入門示例-MVC a). *.fxml文件…