2017-10-04 162 views
0

我有一個非常基本的問題:如何做的時候,你想畫的形狀(我不是在談論textfieldsswitches或其他使用UIViewCAShapeLayer之間你選擇控制,只是繪圖)?使用的UIView主場迎戰CAShapeLayer(繪畫,動畫,用戶交互)

我的理解是,UIView(作爲UIKit的一部分)使用正常的CALayer下繪製其內容。如果這是正確的,那麼CAShapeLayer(或一般CALayer)將是完全相同的東西,只有沒有額外UIKit給你。

那麼,什麼時候使用UIView有意義,何時使用CAShapeLayer有意義?

CAShapeLayer更快?一般情況下,UIKit更適合手勢識別或用戶交互?


給你更多的上下文,這裏就是我一直試圖做的時候這個問題上來:

Illustration

我想這些紅色圓圈圍繞圓心旋轉。但是,用戶應該能夠在旋轉的同時點擊紅色圓圈。

在這裏,我看到兩個主要選項(可能還有更多),以添加這些紅色圓圈中的一種:

  1. 創建UIView,操縱其層的cornerRadius和使用CGAffineTransform旋轉。使用UIBezierPath創建CAShapeLayer。我可以旋轉它使用CATransform3D

我唯一的問題在這裏是user interaction。由於它不斷移動(旋轉),我必須訪問正確的框架。我可以使用presentation layer(我認爲UIView也在引擎蓋下使用)。

此時,我不確定是否使用UIView s或CAShapeLayer s。另外,我不確定以這種方式進行動畫製作是否是這種情況下的正確方法。可能會有更好的選擇,也會消除有關使用哪一個的問題。

感謝您對此的看法。

回答

1

從蘋果的doc報價

層不會對您的應用程序的意見,也就是說,你不能 創建單獨的層對象基於可視化界面的替代品。圖層 爲您的觀點提供基礎設施。具體來說,圖層使得它更容易和更高效地繪製和動畫化視圖 的內容,並在此過程中保持高幀率。但是,有很多層不能做的事情。圖層不處理事件,繪製 內容,參與響應者鏈或做許多其他事情。 因此,每個應用程序都必須有一個或多個視圖來處理這些交互。

在iOS中,每個視圖都由相應的圖層對象支持,但是在OS中,您必須決定哪些視圖應該具有圖層。在之後的OS X v10.8和 中,爲所有視圖添加圖層可能很有意義。 但是,您並不需要這樣做,並且仍然可以在 不支持開銷的情況下禁用圖層。圖層 在某種程度上增加了您的應用程序的內存開銷,但它們的好處通常大於 的缺點,因此在禁用圖層支持之前最好測試應用程序的 性能。

當您爲視圖啓用圖層支持時,您會創建 作爲圖層支持的視圖。在分層視圖中,系統是 ,負責創建底層對象並保持 該層與視圖同步。所有的iOS視圖都是分層支持的,並且OS X中的大多數視圖也是如此。但是,在OS X中,還可以創建 圖層託管視圖,該視圖是您自己提供圖層 對象的視圖。對於圖層託管視圖,AppKit採用 方法管理圖層,並且不會響應 視圖更改而修改它。

閱讀:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CoreAnimationBasics/CoreAnimationBasics.html#//apple_ref/doc/uid/TP40004514-CH2-SW3

現在對於一些QNA

提問時間1:

我的理解是,UIView的(如UIKit中的一部分)使用普通 CALayer在引擎蓋下繪製其內容。如果這是正確的,那麼 CAShapeLayer(或CALayer的一般)是完全一樣的東西, 只是沒UIKit的給你

羣衆演員再次引述蘋果文檔

層支持的觀點創建默認情況下爲CALayer類的實例, ,在大多數情況下,您可能不需要不同類型的圖層對象。 但是,Core Animation提供了不同的圖層類別,每個圖層類別都有 ,它們提供了您可能會覺得有用的專用功能。 選擇不同的層類可能幫助您提高 性能或支持特定類型的內容以簡單的方式

很顯然,當你嘗試繪製各種形狀使用相比CALayerCAShapeLayer在性能方面是有益的。

問題2

是CAShapeLayer更快嗎? UIKit是否對手勢 識別或用戶交互進行了更加優化?

顯然,圖層不處理事件,繪製內容,參與響應者鏈或做很多其他事情。所以,沒有層的能夠識別用戶交互無論它的CALayer或CAShapeLayer

問題3

在這一點上,我不知道是否使用UIViews或CAShapeLayers

正如你在你的問題中指定的那樣你需要紅圈的用戶交互,並且因爲我們現在已經意識到CAShapeLayer/CALayer不會響應用戶交互的事實,所以很清楚你必須使用UIView而不是圖層。

+0

是的,我讀過。 「(...)出於這個原因,每個應用程序必須仍然有一個或多個視圖來處理這些類型的交互(...)」。如果他們的意思是,這些圖層一般應該嵌入到'UIView'中,這意味着'CAShapeLayers'在我的情況下是最好的(因爲嵌入的'UIView'可以處理交互)。如果它們的意思是,每個圖層都需要它自己的視圖(=使用一個由圖層支持的'UIView'),我應該使用'UIView's。我不確定這一點。我的意思是,我確實有一個'UIView',我在這裏做了所有這些,我只是不知道我應該使用'subviews'還是'sublayers' – Quantm

+0

@quantm:iOS中的每個View都有層次支持。默認情況下,你的視圖帶有一個CALayer,你無法替換現有的CALayer,無論你添加的圖層是哪個子圖層,那麼你可以使用CAShapeLayer並將它作爲子圖層添加到視圖的圖層中。你不能使用沒有視圖的簡單圖層,因爲你希望用戶與圈子交互 –

+0

如果沒有用戶交互的簡單動畫,那麼你可以使用CALayers並將它們添加到viewController的視圖,並應用各種CoreAnimation API來動畫,但因爲你需要點擊每個圈子你需要爲每個圓圈創建視圖,併爲每個視圖添加CAShapeLayer作爲子圖層,然後將圓視圖添加爲子視圖到ViewController視圖 –