[英]Difference between autorotation in iOS 8 and prior versions
當我制作以編程方式創建的視圖控制器時,出現了這個問題。 該控制器應該支持任何接口方向。 而據好習慣,我在創建子視圖-viewDidLoad
和建立自己的框架-viewWillLayoutSubviews
。 這樣的方法很好,因為-viewWillLayoutSubviews
不僅可以在開始時布局子視圖,而且還可以處理界面旋轉以及視圖控制器視圖的其他更改。
在iOS 8上一切正常,但是當我在iOS 6和7上運行該應用程序時,布局被破壞了。 我發現原因是布局基於self.view.frame
屬性。 並且,如果您嘗試在不同iOS版本的-viewWillLayoutSubviews
上打印框架,則當設備處於橫向模式時,您將獲得不同的結果。
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
NSLog(@"%@", NSStringFromCGRect(self.view.frame));
}
在iOS 8上輸出(將設備轉到橫向模式后):
2014-10-07 17:35:11.028 BlaBlaApp [361:12587] {{0,0},{568,320}}
在iOS 7和iOS 6上的輸出(相同的設備方向):
2014-10-07 17:35:11.028 BlaBlaApp [361:12587] {{0,0},{320,568}}
在iOS 7和6上,當設備方向更改時,視圖框架不會更改。 但是對我來說,顯然可見區域發生了變化! 我決定研究一下界面旋轉的實際工作原理。
在iOS 7和6上,通過更改其transform
屬性( frame
未更改)來旋轉視圖。 反過來,在iOS 8上,視圖控制器視圖的transform
屬性始終等於CGAffineTransformIdentity
,並且frame
會根據方向發生變化。
我設法用一串代碼(沒有宏和if語句)解決了我的問題:
CGRect actualFrame = CGRectApplyAffineTransform(self.view.frame, self.view.transform);
在任何iOS版本上, actualFrame
視圖都可以根據actualFrame
以類似的方式定位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.