2015-02-12 60 views
3

語境CALayer的不視圖

我使用this simple library使我的應用程序的前奏/演練內正確地定位(TL; DR,水平尋呼視圖控制器)。我目前有3頁設置。

在第3個演練頁面中,我有一個自定義的CALayer,它在無限循環中爲一個圓圈動畫。我想將該圖層添加到UIView以便在IB中通過我想要的方式佈局(通過自動佈局)。

viewDidLoad(用於第三頁)創建的圓層,並設置其幀是相同的,因爲我定位視圖,假設圓將是在同一地點的視圖:

for v:UIView in [view1!, view2!] { 
     var pulse = PulseLayer() 
     pulse.frame = v.frame 
     pulse.cornerRadius = v.frame.width/2.0 
     pulse.masksToBounds = false 
     view.layer.insertSublayer(pulse, above: v.layer) 
    } 

問題

當我在iPhone 6模擬器中運行應用程序時,CALayers在其UIViews外顯示(見下文)。

CALayers misplaced

有一件事我立刻注意到的是層沒有錯以同樣的方式 - 一個是它上面的觀點,另一個是向左。我假設這與視圖的約束有關,但我無法弄清楚如何解決它。

同樣令我困惑的是,當在iPhone 5模擬器上運行時,圖層顯示與我預期的完全相同(請參閱下文)。

Layers correctly placed

我覺得我在這裏工作的誤解的一些概念。我怎樣才能讓定位表現得一樣呢? (像iPhone5的gif)

或者,有沒有更好的方法來做我想做的事情?

回答

5

viewDidLoad爲時尚早。請記住,viewDidLoad是提前;該視圖還沒有在界面中,沒有任何其最終的大小/位置。如果您要將圖層添加到view而不是小視圖的子圖層,則必須稍後才能運行圖層創建代碼,以獲得正確的位置。 viewDidAppear:viewDidLayoutSubviews將是安全的 - 但當然,您必須使用bool標誌,因此您不要多次執行此操作。

就我個人而言,我不明白爲什麼不將圖層添加到小視圖中。因此,您只需設置pulse.frame = v.bounds並將其添加爲v而不是您的view。它解決了定位問題並獲得了正確的關係。在viewDidLoad中這樣做會有效,因爲當視圖移動時,圖層會隨着它們一起移動。