簡體   English   中英

iOS動畫塊如何工作?

[英]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 ,並且如果是,則不會立即生效(而是將其添加到要為該動畫設置動畫的事物列表中)。

因此,塊版本在預塊版本的上下文中非常簡單:您可以將其視為在beginAnimationscommitAnimations行中運行動畫塊。

Apple並沒有真正談論它如何運作的細節,但這就是我認為發生的事情:

將視圖添加到視圖層次結構時,系統會在視圖的所有可動畫屬性上添加KVO觀察器。

動畫塊執行時,系統會設置一個狀態,以監視這些屬性上的KVO通知。 然后,調用的代碼會創建相應的CAAnimation對象並將其添加到每個受影響的視圖層。

暫無
暫無

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

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