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

相关问题