当我以编程方式创建视图控制器时出现了这个问题。该控制器应该支持任何接口方向。根据良好做法,我在-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视图框不会更改。但很明显,对于我来说,视野的可见区域会发生变化!我决定调查接口旋转的实际工作方式......
答案 0 :(得分:3)
在iOS 7和6视图上通过更改其transform
属性进行轮换(frame
未更改)。在iOS 8上,视图控制器视图的transform
属性始终等于CGAffineTransformIdentity
,frame
根据方向而变化。
我设法用一串代码解决了我的问题(没有宏和if语句):
CGRect actualFrame = CGRectApplyAffineTransform(self.view.frame, self.view.transform);
可以在任何iOS版本上以类似的方式根据actualFrame
定位子视图。