iOS - UIView與CALayer&隱式動畫與顯示動畫

每個 UIView 內(nèi)部都有一個 CALayer 在背后提供內(nèi)容的繪制和顯示颠锉,并且 UIView 的尺寸樣式都由內(nèi)部的 Layer 所提供祟峦。兩者都有樹狀層級結(jié)構(gòu),layer 內(nèi)部有 SubLayers副渴,View 內(nèi)部有 SubViews.但是 Layer 比 View 多了個AnchorPoint

在 View顯示的時(shí)候翼悴,UIView 做為 Layer 的CALayerDelegate,View 的顯示內(nèi)容取決于內(nèi)部的 CALayer 的 display

CALayer 是默認(rèn)修改屬性支持隱式動畫的,在給 UIView 的 Layer 做動畫的時(shí)候隔缀,View 作為 Layer 的代理题造,Layer 通過 actionForLayer:forKey:向 View請求相應(yīng)的action(動畫行為)

layer 內(nèi)部維護(hù)著三分layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在做 iOS動畫的時(shí)候,我們修改動畫的屬性猾瘸,在動畫的其實(shí)是 Layer 的 presentLayer的屬性值,而最終展示在界面上的其實(shí)是提供 View的modelLayer

兩者最明顯的區(qū)別是 View可以接受并處理事件界赔,而 Layer 不可以

隱式動畫與顯示動畫:

隱式動畫
不需要初始化任何類,系統(tǒng)自己處理的動畫屬性
粗淺的可以理解為牵触,系統(tǒng)默認(rèn)淮悼,自帶的效果
這其實(shí)就是所謂的隱式動畫。之所以叫隱式是因?yàn)槲覀儾]有指定任何動畫的類 型揽思。我們僅僅改變了一個屬性袜腥,然后Core Animation來決定如何并且何時(shí)去做動 畫。Core Animaiton同樣支持顯式動畫钉汗,

核心動畫的隱式動畫模型假定所有動畫圖層屬性的變化應(yīng)該是漸進(jìn)的和異步的羹令。

動態(tài)的動畫場景可以在沒有顯式的動畫圖層時(shí)候?qū)崿F(xiàn)。
改變動畫顯示的圖層的屬性將會導(dǎo)致圖層隱式把舊值動畫顯示為新值损痰,雖然動畫是持續(xù)的福侈,但是設(shè)置新的目標(biāo)值會導(dǎo)致圖層從當(dāng)前狀態(tài)動畫過度到新的目標(biāo)值

OrderSearchVC *search = [[OrderSearchVC alloc] init];
[self.navigationController pushViewController:search animated:YES];

根據(jù)我粗淺的理解,「隱式動畫」中的所謂「隱式」徐钠,是相對于「顯式動畫」中的顯式而言的癌刽。
實(shí)現(xiàn)顯式動畫時(shí),往往會創(chuàng)建一個動畫對象,譬如CAAnimation显拜、CABasicAnimation衡奥、CAKeyframeAnimation,然后通過CALayer#addAnimation(_:forKey:)方法該動畫對象綁定到layer中远荠,

顯式動畫

核心動畫同事提供了一個顯示動畫模型矮固。該顯式動畫模型需要你創(chuàng)建一個動畫對象,并設(shè)置開始值和結(jié)束的值譬淳,顯示動畫不會開始執(zhí)行档址,直到你把該動畫應(yīng)用到某個圖層上面
CABasicAnimation *opAnim = [CABasicAnimation animationWithKeyPath:@opacity];
opAnim.duration = 1.0;
opAnim.fromValue = [NSNumber numberWithFloat:0.1];
opAnim.toValue= [NSNumber numberWithFloat:1.0];
opAnim.repeatCount = 1;
[view.layer addAnimation:opAnim forKey:@animateOpacity];

iOS 動畫會改變frame嗎?

在iOS開發(fā)中邻梆,動畫本身通常不會直接改變視圖的frame屬性守伸,但動畫的效果會讓視圖看起來像是在移動、縮放浦妄、旋轉(zhuǎn)或改變透明度等尼摹。這種視覺上的變化是通過改變視圖層的屬性(如CALayerpositionbounds剂娄、transform等)來實(shí)現(xiàn)的蠢涝,而不是直接修改frame

幀(Frame)與層(Layer)

  • 幀(Frame)UIViewframe屬性定義了視圖在其父視圖坐標(biāo)系統(tǒng)中的位置和大小阅懦。這是一個矩形和二,通常用CGRect結(jié)構(gòu)體表示,包含origin(原點(diǎn)耳胎,即左上角的位置)和size(尺寸)惯吕。
  • 層(Layer)UIView的底層是由CALayer實(shí)現(xiàn)的。CALayer提供了對視圖內(nèi)容渲染的底層支持场晶,包括位置混埠、大小、透明度诗轻、邊框钳宪、陰影等屬性的管理。動畫效果通常是通過修改CALayer的屬性來實(shí)現(xiàn)的扳炬。

動畫與frame

  1. 動畫執(zhí)行:當(dāng)你對視圖應(yīng)用動畫(如使用UIView的動畫塊或Core Animation框架)時(shí)吏颖,你通常會修改與動畫相關(guān)的層屬性(如positionbounds恨樟、transform等)半醉。這些變化會立即反映在視覺上,但frame屬性可能不會自動更新以反映這些變化劝术。

  2. framebounds/centerframe是相對于父視圖的缩多,而boundscenter是相對于視圖自身的呆奕。當(dāng)你通過動畫改變視圖的位置時(shí)(例如,通過修改centerposition)衬吆,雖然視圖在屏幕上移動了梁钾,但其frameorigin可能并沒有立即更新(因?yàn)樗匀槐硎驹诟敢晥D坐標(biāo)系中的原始位置)。但是逊抡,如果你通過修改frame本身來移動視圖(而不是通過動畫)姆泻,則frame會立即更新,但這種情況下不會有動畫效果冒嫡。

  3. 動畫完成后的狀態(tài):如果你通過動畫改變了視圖的位置或大小拇勃,并希望這些變化在動畫完成后保持下來,你需要確保在動畫開始前或在動畫的完成回調(diào)中手動更新frame屬性(如果需要的話)孝凌。不過方咆,在很多情況下,由于CALayer的屬性(如position)已經(jīng)改變胎许,所以frame可能會間接地“看起來”已經(jīng)更新峻呛,即使你沒有顯式地設(shè)置它。

結(jié)論

動畫本身不會直接改變frame辜窑,但動畫的效果可能會讓視圖看起來像是改變了位置或大小。如果你需要確保動畫完成后的狀態(tài)與動畫過程中的狀態(tài)一致寨躁,你可能需要手動更新frame或其他相關(guān)屬性穆碎。然而,在大多數(shù)情況下职恳,通過修改CALayer的屬性(如position所禀、boundstransform)來實(shí)現(xiàn)動畫效果就足夠了放钦,因?yàn)閕OS的視圖系統(tǒng)會在底層處理好這些變化與frame之間的關(guān)系色徘。

作者:不簡單的風(fēng)度
鏈接:http://www.reibang.com/p/ed40da9303b1
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)操禀,非商業(yè)轉(zhuǎn)載請注明出處褂策。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市颓屑,隨后出現(xiàn)的幾起案子斤寂,更是在濱河造成了極大的恐慌,老刑警劉巖揪惦,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遍搞,死亡現(xiàn)場離奇詭異,居然都是意外死亡器腋,警方通過查閱死者的電腦和手機(jī)溪猿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門钩杰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讲弄,你說我怎么就攤上這事翎冲】购罚” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵赏壹,是天一觀的道長蝌借。 經(jīng)常有香客問我指蚁,道長,這世上最難降的妖魔是什么稍坯? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任瞧哟,我火速辦了婚禮勤揩,結(jié)果婚禮上秘蛔,老公的妹妹穿的比我還像新娘。我一直安慰自己缠犀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布虐急。 她就那樣靜靜地躺著滔迈,像睡著了一般被辑。 火紅的嫁衣襯著肌膚如雪敬惦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天宏怔,我揣著相機(jī)與錄音臊诊,去河邊找鬼斜脂。 笑死帚戳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的偏友。 我是一名探鬼主播对供,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涝动!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起醋粟,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤重归,失蹤者是張志新(化名)和其女友劉穎米愿,沒想到半個月后鼻吮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體育苟,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椎木,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年违柏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了博烂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漱竖。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡禽篱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馍惹,到底是詐尸還是另有隱情躺率,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布悼吱,位于F島的核電站,受9級特大地震影響勤众,放射性物質(zhì)發(fā)生泄漏们颜。R本人自食惡果不足惜吕朵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一阻问、第九天 我趴在偏房一處隱蔽的房頂上張望梧税。 院中可真熱鬧称近,春花似錦刨秆、人聲如沸凳谦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尸执。三九已至,卻和暖如春缓醋,著一層夾襖步出監(jiān)牢的瞬間如失,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工送粱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褪贵,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓葫督,卻偏偏與公主長得像竭鞍,于是被迫代替她去往敵國和親板惑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

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