2013-02-16 245 views
3

創建測試項目後,爲了幫助獲取 相關問題的一些答案,我最近在SO (已刪除)上詢問,我遇到了一個不同的,雖然類似的問題,旋轉一層自定義UIView子類。圖層以x/y軸而不是z軸旋轉

可以看到iPhone模擬器會話的視頻here

根據需要,圖層看起來像是在x/y軸上旋轉,對角線上,而不是圍繞z軸旋轉。

執行旋轉的代碼稱爲setAngle:如下的圖setter方法中:

_imageLayer.transform = CATransform3DMakeRotation(angle/180.0 * M_PI, 0.0, 0.0, 1.0); 

(其中angle爲度)。

完整的Xcode項目可用here

最初的SO問題只是在設備方向發生變化後才顯示出這種行爲,所以看起來在我的理解中存在比我第一次想到的更多的空白(來自OSX背景,並且多次使用圖層,我預期不會這些問題)。

所以我的問題是:爲什麼不是根據需要圍繞z軸旋轉的層?

+0

我得到了這個地方,它涉及如何設置圖層'框架。如果我設置了「邊界」和「位置」,那麼圖層就像平常一樣旋轉,但是這個關鍵似乎是獲得了視圖的寬度/高度,這說明了設備方向。這是我的理解缺乏的地方... – trojanfoe 2013-02-16 12:05:13

回答

2

我正要回答,但你搶先了我!反正這裏是我說(它確實解決了你的最後一點)

的主要原因是不可預知的行爲是要設置變換對象的框架屬性。這是你不能做的 - 蘋果警告它*:在應用變換之後,frame屬性將返回未定義的結果。

,所以你不應該這樣做:

//_imageLayer.frame = layerFrame; 

但設置boundscenter屬性(CALayers的情況下position)繼續按預期工作,因此,你可以做這樣的事情:

_imageLayer.bounds = (CGRect){0,0,min,min}; 
    _imageLayer.position = self.center; 


*看到 documentation在UIView的框架屬性:

警告:如果transform屬性不是標識轉換,則此屬性的值未定義,因此應予以忽略。

+0

啊好的;我錯過了,所以這是問題的根源。非常感謝。 – trojanfoe 2013-02-16 14:41:51

0

好的,現在這個問題已經修復。更新的項目是here

學到的問題是:

  • 不要從內設置視圖的框架視圖控制器的viewWillLayoutSubviews 這可能是問題的根源。 只要將autoresize掩碼設置爲將視圖拉伸到窗口邊界,您就不需要在自定義[ViewController _currentRect]方法中執行任何計算。

  • 不要將圖層排列在[UIView layoutSubviews]中,因爲在圖層旋轉(!!)時調用該圖層效率不高。相反,我使用[UIView setBounds:]來佈置圖層。在設備方向更改後調用setBounds:,但出於某種奇怪的原因,它未在新創建的視圖上調用,因此我忽略[UIView didMoveToSuperview]以顯式調用它(self.bounds = self.bounds;)。 Curiouser和curiouser。

  • 我設置圖層的boundsposition,而不是設置層的frame鋪設的時候出來, 我認爲是根源(事情開始工作,我這樣做後),但我看不出這使得任何差異,我認爲這是第一個要點 中提到的錯誤的副作用。 UPDATE:正如@He Was的答案中指出的那樣;這的根本原因。

我不會將此答案標記爲正確的,因爲我仍然有一種疼痛的感覺,即我的解決方案不是100%「正確」。