2010-11-04 146 views
1

首先,我在iOS開發方面有很多經驗,但我並不那麼熱衷於Core Animation。我想在Safari瀏覽器(包括iPhone和iPad)中重現這種效果,當您查看的頁面縮小並縮小到縮略圖視圖時,並且在選擇給定的縮略圖後,它會「放大」,然後相應的頁面被恢復。iPad Safari類似放大縮小視圖

什麼是實現這一目標的最佳方式是什麼?我將它應用到一個reguiar UIView子類 - 不是一個UIWebView - 但我不太確定如何做整個縮小效果,並指定縮小的縮略圖的目標框架(假設我有很多縮略圖在屏幕上和我想將當前的觀點放入一個特定的縮略圖中)。

最佳,

回答

2

很可能是一個簡單的CoreAnimation效果,調節所述視圖變換,而不是幀。這應該適用於任何觀點。我很樂觀,你缺乏敏銳是陌生而不是真正的不喜歡,所以我會繼續與CoreAnimation的答案,以防萬一它有幫助...

UIView有一個非常方便的方法來設置動畫。例如,要做的視圖的動畫縮小到一半大小,離開它集中在相同的位置:

[UIView beginAnimations:nil context:nil]; 
view.transform = CGAffineTransformMakeScale(0.5f, 0.5f); 
[UIView commitAnimations]; 

要縮小其與50個像素移動其中心向右:

[UIView beginAnimations:nil context:nil]; 
view.transform = CGAffineTransformTranslate(CGAffineTransformMakeScale(0.5f, 0.5f), 50.0f, 0.0f); 
[UIView commitAnimations]; 

並把它從任一狀態恢復到正常:

[UIView beginAnimations:nil context:nil]; 
webView.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
[UIView commitAnimations]; 

理論背後卻是意見某些屬性是動畫。這些都是CoreAnimation能夠獨立進行動畫調整的屬性。 UIView類方法beginAnimations:context:和commitAnimations設置,然後開始一個CoreAnimation塊。從本質上講,beginAnimations:context:不會立即生效,而是設置爲動畫的目標狀態。當您執行commitAnimations時,會出現動畫。

還有一些其他控件可以用來通過UIView便捷方法調整動畫,所有這些都在UIView文檔中描述。

如果你不使用CoreAnimation,那麼你必須自己對這個轉換進行逐幀調整,但我真的沒有看到這種方法的好處 - 它會花費更多以CPU計算,並且不太可能接近平穩。

絕對堅持轉換,而不是調整幀,如果你可以;調整變換會改變視圖添加到屏幕的方式。它不會導致視圖本身重繪。所以如果你改變比例,就像放大視圖的圖像一樣。如果你改變了框架或邊界,那麼iOS將放棄它當前的視圖外觀和請求重繪的緩衝區,這會花費更多。更糟糕的是,如果您有任何坐在CATiledLayer上的東西(例如地圖視圖或Web視圖),那麼該視圖將變成其背景顏色,並且可能不會再次淡入,直到動畫完成。同樣,任何決定如何基於框架大小繪製的視圖都不會按比例縮放,而只是改變大小。

+0

嗨湯米,謝謝你的詳細回覆。我一直在使用UIView動畫來做一些基本的東西,以及CATransition,這就是我對CoreAnimation的體驗結束的地方。我從來沒有碰過的是視圖轉換屬性,主要是因爲我沒有機會真正理解它。但根據你的建議,它看起來並不複雜,似乎是做我要找的東西的方法。現在怎麼樣轉換到縮略圖視圖?我可以在同一個動畫塊中添加它作爲子視圖,初始alpha值爲0並增加它嗎? – boliva 2010-11-12 15:05:36

+0

作爲子視圖添加立即生效,無論是在動畫塊內部還是外部,但alpha都是動畫屬性,因此應該可以安全地將其添加爲alpha,然後將alpha設置爲1以便平滑過渡。 – Tommy 2010-11-12 15:57:20