2015-11-01 45 views
0

當我的應用程序啓動時,我有一個自定義啓動屏幕,它只有標誌,並且旨在爲徽標設置動畫,以便它與登錄屏幕上徽標的框架排成一行。因此,在viewDidLoad()中,我獲取了故事板對象的框架,並嘗試在動畫期間將該框架設置爲我自定義視圖的新框架。雖然自定義視圖移動到新位置的位置,但我遇到了一個奇怪的問題,但視圖的大小或位置並不像預期的那樣。將imageView的新框架設置爲故事板對象的框架

下面是如何設置的新框架:

print("Existing frame: \(self.frame)") 
print("New frame: \(self.frameToExpandTo!)") 
self.frame = self.frameToExpandTo! 
self.frame.size = self.frameToExpandTo!.size 
self.center = self.newCenter! 
self.layoutIfNeeded() 
print("Frame after update: \(self.frame)") 

當打印語句執行,我有正確的舊框架和自定義視圖的新框架,但它仍然不會在預期的位置。

Console output

而且這裏是自定義視圖看起來像動畫後:The smaller view to the top left is the custom view that is supposed to be in the same place as the large logo in the center, but as you can see it's in the wrong place and has the wrong size.

我在做什麼錯?剛剛開始進入動畫更多,所以我肯定我錯過了一些明顯的東西,但希望有人可以指出我。

+0

什麼是self.frameToExpandTo?你如何檢索它? – DisableR

+0

在我創建自定義'subView'的'viewDidLoad'中,我設置了'splashIcon.frameToExpandTo = self.logoView.frame',其中'logoView'是一個連接到徽標的IBOutlet。 – pbush25

回答

0

所以經過多次商談,並感謝@DisableR,我發現我的解決方案。它包括越來越喜歡這個新的框架在我的自定義函數:splashIcon!.frameToExpandTo = splashIcon!.superview!.convertRect(self.logoView.bounds, fromView: self.logoView)

而且進一步,而不是在viewDidLoad調用這個自定義函數,我把它叫做在viewWillLayoutSubviews這給了我爲我試圖動畫的正確幀完成。

我現在意識到在我原來的問題中打印出來的框架是在故事板中設置的框架,而不是標識實際位於視圖中的框架,所以在viewWillLayoutSubviews中調用此框架可以在右側給出正確的框架如果我的自定義函數是在viewDidAppear中調用的,那麼首先顯示底層視圖就不會出現任何結局。

1

嘗試了這一點:

splashIcon.frameToExpandTo = self.logoView.window!.convertRect(self.logoView.bounds, fromView:self.logoView) 

然後在這個問題您的代碼段:

self.frame = self.window!.convertRect(self.frameToExpandTo!, toView:self) 

但是這將需要viewDidAppear要執行,因爲viewDidLoad你沒有窗戶尚未。

如果您的viewController的視圖是self.logoView和splashIcon的替代視圖,那麼轉換將從viewDidLoad起作用,但您需要使用視圖控制器而不是窗口進行轉換。例如。

splashIcon.frameToExpandTo = self.splashIcon.superview!.convertRect(self.logoView.bounds, fromView:self.logoView) 

self.frame = self.frameToExpandTo! 
+0

好的進步!這確實起作用,但是因爲它在'viewDidAppear'中,所以底層視圖首先出現,這使得UI看起來像是口吃。任何建議? – pbush25

+0

問題在於不同的座標系。不幸的是,直到你splashIcon是一個窗口(因此,viewDidAppear被稱爲)上,有一個座標從一個視圖層次結構轉換爲另一種不合法的方式。在這種情況下,只有硬編碼才能完成這項工作。 – DisableR

+0

嗯,我不能硬編碼,因爲它在所有的屏幕尺寸工作。但是不應該在'viewDidLoad'中設置框架?這是一個隱含的解包可選項,你應該可以從那裏訪問框架。 – pbush25