2011-02-28 29 views
0

大家好 我試圖瞭解塊如何工作。iPhone塊解釋

[UIView animateWithDuration:1 animations:^{ 
blueViewController.view.alpha = 0; 
yellowViewController.view.alpha = 0; 
}]; 

我很想知道他們是如何實現這個過渡。正如我所看到的,將視圖的alpha更新爲0的塊只能被執行,並且會導致即時更新而不是動畫? 如果有人能向我解釋他們是如何實現這個功能的話,它能夠幫助我理解塊的工作方式。

另外我覺得它有點奇怪,我創建的封閉塊只創建只讀變量。那麼我如何能夠更改alpha而不用「_ block」關鍵字來定義它?是否只有縮放器類型需要「_block」? (int/float ect)。

回答

2

魔術不是Block系統,它只是允許你創建和調用匿名函數。魔術是核心動畫框架。

其基本原理是所有參數都立即應用,但Core Animation不會立即重新繪製所有內容,而是查找更改並將其應用於給定的動畫持續時間。

查看Core Animation框架參考和WWDC 2010會話424和425以獲取更深入的信息。

0

塊只是一種回調,它可以傳遞給另一個範圍,同時仍然可以訪問局部變量,從它定義的範圍。 這就是封閉。

你的問題似乎更關係到CoreAnimation ...

0

我覺得其他的答案覆蓋塊本身和核心動畫和動畫塊(不同使用術語「塊」的)之間的區別。

但是對於你關於捕獲變量的問題,你得到的是指針'blueViewController'和'yellowViewController'的const副本。指針本身是常量拷貝,但是你使用這些指針來訪問底層視圖控制器對象來檢索每個視圖,然後發送每個視圖 - [UIView setAlpha:]消息。

如果你把它拼出來,可能會更清楚。在您的區塊內有:

UIView *view = [blueViewController view]; // <-- send view message to the const pointer 
[view setAlpha:0.0]; // <-- Now send a setAlpha message to the view 

blueViewController.view.alpha = 0.0只是上述的簡寫。

希望有所幫助。

0

您可以從塊訪問任何實例變量或全局變量。

[UIView animateWithDuration:1 animations:^{ 
blueViewController.view.alpha = blueViewController.myAlphaValue; 
yellowViewController.view.alpha = 0; 
}]; 

blueViewController和yellowViewController自動從塊保留,因爲這些都是Objective-C對象,它是安全的,從塊存取,而不必擔心實例的壽命。如果blueViewController和yellowViewController是ivar,那麼塊只會自動保留self。

__block存儲類型修飾符也可以用於指針。

__block MyViewController *myViewController = self.viewController; 

但是,即使此變量是Objective-C對象,該變量也不會從塊中自動保留。小心__block Objective-C對象的生命週期。

^{ 
    myViewController = self.viewController; 
    /* If myViewController is with __block modifier, it is ok. */ 
    /* If myViewController is without __block modifier, this line is not able to compile. */ 
}; 

The __block Storage Type