2

當我編程式創建視圖控制器時,出現了這個問題。這個控制器應該支持任何接口方向。根據良好的做法,我在-viewDidLoad上創建了子視圖,並在-viewWillLayoutSubviews上設置了框架。這種方法很好,因爲-viewWillLayoutSubviews不僅在開始時佈局子視圖,還處理接口旋轉和視圖控制器視圖的其他更改。iOS 8和以前版本之間自動轉換的區別

在iOS 8上一切正常,但是當我在iOS 6和7上運行應用程序時,佈局被破壞了。我發現原因是該佈局基於self.view.frame屬性。如果您嘗試在不同的iOS版本的-viewWillLayoutSubviews上打印幀,當設備處於橫向模式時,您會得到不同的結果。在iOS 8

- (void)viewWillLayoutSubviews 
{ 
    [super viewWillLayoutSubviews]; 
    NSLog(@"%@", NSStringFromCGRect(self.view.frame)); 
} 

輸出(轉動裝置爲橫向模式後):

2014年10月7日17:35:11.028 BlaBlaApp [361:12587] {{0,0}, {568,320}}在iOS 7和圖6(同樣的設備取向)

輸出:

2014年10月7日17:35:11.028 BlaBlaApp [361:12587] {{0,0},{320,568}}

在iOS 7和6視圖幀不改變時設備方向改變。但對我而言,視野的可見區域變化顯而易見!我決定調查實際界面旋轉的工作原理...

回答

3

在iOS 7和6視圖通過更改其transform屬性(frame未更改)進行旋轉。在iOS 8上,視圖控制器視圖的transform屬性總是等於CGAffineTransformIdentity,並且frame根據方向而變化。

我設法解決我的問題,一個代碼串(不含宏和if語句):

CGRect actualFrame = CGRectApplyAffineTransform(self.view.frame, self.view.transform); 

子視圖可以根據任何版本的iOS類似的方式actualFrame定位。

+0

「此處輸入代碼」不屬於響應中。 – EricS 2014-10-07 18:24:02

+0

謝謝!固定。 – kelin 2014-10-08 08:24:47

相關問題