[英]How do iOS animation blocks work?
在iOS中,您可以使用動畫塊為視圖對象設置動畫:
[UIView animateWithDuration:1.0 animations:^{
firstView.alpha = 0.0;
secondView.alpha = 1.0;
}];
我們這里有一個代碼塊,它描述了動畫完成后視圖屬性最終會看到的內容。
這是如何運作的?
我能理解(我認為)如果這是使用一些聲明性格式完成的,但從它的外觀來看,動畫塊只是一段常規代碼,可能必須執行,結果檢查然后有人轉碼到實際執行動畫的低級圖形代碼。
塊是否實際執行(或以某種方式反向工程),如果是,何時?
如果在動畫開始之前執行此代碼,那么對引用的視圖屬性的更改如何不立即反映?
如果我將代碼放在不改變視圖屬性的塊中,但是做了其他什么,會發生什么?
是的,實際調用了塊 - 然后它立即更改了視圖的屬性。 UIView的屬性設置器負責查看是否在動畫上下文中使用了該集合 - 如果是這樣,他們使用CoreAnimation和CoreGraphics計算動畫幀等。
如果將非動畫代碼放入這些塊中,則不會發生任何特殊情況 - 該塊將立即執行。
在塊之前查看等效代碼是有益的:
[UIView beginAnimations:@"foo" context:NULL];
[UIView setAnimationDuration:1.0];
firstView.alpha = 0.0;
secondView.alpha = 1.0;
[UIView commitAnimations];
所以你看,即使在塊之前,還要直接設置要更改的屬性; 但是,它們不會立即生效(它們是動畫的)。
它是如何工作的? 據推測,當您在視圖上設置屬性時,它會檢查您是否運行beginAnimations
而不是commitAnimations
,並且如果是,則不會立即生效(而是將其添加到要為該動畫設置動畫的事物列表中)。
因此,塊版本在預塊版本的上下文中非常簡單:您可以將其視為在beginAnimations
和commitAnimations
行中運行動畫塊。
Apple並沒有真正談論它如何運作的細節,但這就是我認為發生的事情:
將視圖添加到視圖層次結構時,系統會在視圖的所有可動畫屬性上添加KVO觀察器。
動畫塊執行時,系統會設置一個狀態,以監視這些屬性上的KVO通知。 然后,調用的代碼會創建相應的CAAnimation對象並將其添加到每個受影響的視圖層。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.