簡體   English   中英

iOS層動畫-說明

[英]iOS layer animation - explanation

let flyRight = CABasicAnimation(keyPath: "position.x")
flyRight.toValue = view.bounds.size.width/2
flyRight.duration = 0.5
flyRight.fromValue = -view.bounds.size.width/2
flyRight.fillMode = kCAFillModeBoth
flyRight.beginTime = CACurrentMediaTime() + 3.4
password.layer.position.x = view.bounds.size.width/2
password.layer.addAnimation(flyRight, forKey: nil)

我的問題是:在添加動畫之前,怎么可能先將圖層放置在結束位置,但是當應用程序啟動時,在動畫開始之前我看不到圖層嗎? 而是,動畫將在3.4秒后按預期方式工作。

我的意思是,iOS如何知道它首先需要運行動畫,然后才將圖層放置到最終位置?

它與應用UI更改的方式有關。 當您對UI對象進行更改時,直到您的代碼返回並且事件循環運行,該更改才會呈現到屏幕上。

發生這種情況時,系統會將您的視圖移動到最終位置,但是ACTUAL視圖/層的層次結構將覆蓋在頂部繪制的新層(稱為表示層)中。 表示層是動畫像素顯示在屏幕上的位置。 那就是你所看到的。

動畫結束后,將隱藏/刪除表示層(不確切地說是哪個),並顯示實際的層內容。 到那時,圖層處於其最終位置,因此一切看起來正確。

這是因為有一個presentationLayer和一個modelLayer所以動畫顯示並修改了presentationLayer ,所以presentationLayer就像是一個幽靈。

您可能知道UIView實例以及支持圖層的NSView會修改其圖層,以將渲染委派給功能強大的Core Animation框架。 但是,重要的是要了解,動畫在添加到圖層時不要直接修改其屬性。 相反,Core Animation維護兩個並行的層層次結構:模型層樹和表示層樹。 前者中的圖層反映了圖層的眾所周知狀態,而后者中只有圖層近似於動畫的運行中值。 考慮將淡出動畫添加到視圖中。 如果在動畫過程中的任何時候檢查圖層的不透明度值,則很可能不會獲得與屏幕上的透明度相對應的不透明度。 相反,您需要檢查表示層以獲得正確的結果。 盡管您可能無法直接設置表示層的屬性,但在動畫發生時使用其當前值來創建新動畫或與層交互可能會很有用。 通過使用-[CALayer PresentationLayer]和-[CALayer modelLayer],您可以輕松地在兩層層次結構之間切換。

您可以在這里找到更多信息https://www.objc.io/issues/12-animations/animations-explained/

我希望這可以幫助你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM