iOS 8和之前版本中自动旋转的区别

时间:2014-10-07 14:58:50

标签: ios objective-c iphone uiviewcontroller uiinterfaceorientation

当我以编程方式创建视图控制器时出现了这个问题。该控制器应该支持任何接口方向。根据良好做法,我在-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和6上的输出(相同的设备方向):

  

2014-10-07 17:35:11.028 BlaBlaApp [361:12587] {{0,0},{320,568}}

在设备方向更改时,iOS 7和6视图框不会更改。但很明显,对于我来说,视野的可见区域会发生变化!我决定调查接口旋转的实际工作方式......

1 个答案:

答案 0 :(得分:3)

在iOS 7和6视图上通过更改其transform属性进行轮换(frame未更改)。在iOS 8上,视图控制器视图的transform属性始终等于CGAffineTransformIdentityframe根据方向而变化。

我设法用一串代码解决了我的问题(没有宏和if语句):

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

可以在任何iOS版本上以类似的方式根据actualFrame定位子视图。