2010-01-08 32 views
1

我遇到性能問題。如何使用性能動畫多邊形蒙版?

我創建了一個UIView並覆蓋它的drawRect函數。在這個函數中,我正在繪製一個圖像(大的圖像),並且在整個屏幕上有一個白色正方形,裏面有一個多邊形,帶有CGContextEOFillPath。結果是顯示部分圖像(由多邊形定義)的白色屏幕。

之後,我創建了一個函數來爲該多邊形的過渡設置另一個。除了多邊形動畫之外,還應該縮放圖像並移動以修復屏幕上的顯示。我用NSTimer做了這個。多邊形的動畫包括計算每個頂點之間的距離,然後根據elapsedTime移動到一個位置。它在模擬器上工作得很好,但是在設備上真的很困難。

閱讀關於性能,在這裏在stackoverflow,我發現替代使用beginAnimations和commitAnimations。我正在改變一切,在圖像上使用這種方法。但是我能用多邊形做什麼。多邊形是用CGContextMoveToPoint和CGContextAddLineToPoint繪製的,所以我相信它不能用beginAnimations動畫。我正確嗎?有沒有更好的方法來做到這一點?

期望的結果是這樣的漫畫閱讀器應用程序:(點擊導遊在他們表現出視頻中的「自動屏蔽」功能的中間)http://www.comixology.com/iphoneapp

回答

0

我的建議是使用CAShapeLayer覆蓋在你的主圖像視圖,與CAShapeLayer是要掩蓋視圖的大小並具有多邊形路徑在它的中心有一個洞。 CAShapeLayers可讓您從一個CGPathRef動畫到另一個,只要兩條路徑具有相同數量的控制點。你需要在這裏使用CABasicAnimation來做動畫,而不是UIView的begin/commitAnimations塊,但這並不難。

Joe Ricioppo在他的帖子here中有一個很好的動畫CAShapeLayer路徑的例子。

+0

謝謝,我會先嚐試這種方法,如果我沒有成功,我會給阿德里安的一個嘗試。之後我討厭答案,好嗎?再次感謝! –

0

隨着核心動畫,你可以動畫「動畫」 (原文如此)屬性。蘋果公司的文件列舉了Mac OS X的動畫屬性:

http://url.akosma.com/55

在iPhone的情況下,UIView的文件明確表示,「動畫」當一個屬性是,哼哼,動畫。其中最強大的是(IMHO)UIView的「transform」屬性,它將CGAffineTransform結構作爲輸入,或者CALayer的「transform」屬性(它採用CATransform3D結構)。兩者都具有動畫效果,併爲您創建任何想要的轉換提供了巨大的動力。

現在,您的情況的確如此,您不能以「簡單」的方式對多邊形進行動畫處理。我敢打賭,試圖映射符合您的需求的CGAffineTransforms(縮放,翻譯)並將其應用於使用Quartz代碼創建的非動畫固定視圖。

我希望我足夠清晰的:)