我在Swift 3中使用自定义相机视图叠加。当我将相机从横向移动到纵向时,它会将相机视图尺寸缩小。有没有办法检查设备方向并更改框架边界?现在我使用的代码行是
previewLayer?.frame = self.view.bounds
答案 0 :(得分:2)
你有几种选择。主要思想是在视图发生变化时调用函数。
选项1,iOS8 +
从iOS 8开始,所有与轮换相关的方法都已弃用。相反,旋转被视为视图控制器视图大小的变化,因此使用viewWillTransition(to:with :)方法进行报告。当界面方向改变时,UIKit在窗口的根视图控制器上调用此方法。该视图控制器然后通知其子视图控制器,在整个视图控制器层次结构中传播消息。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
var previewLayer:CALayer?
if let layer = previewLayer {
layer.frame = self.view.bounds //or:
layer.frame.size = size //If coordinates is (x:0,y:0) you only need to update the size, and that is provided through the function
}
}
选项2,iOS 6& 7 强>
在iOS 6和iOS 7中,您的应用程序支持应用程序的Info.plist文件中定义的界面方向。视图控制器可以覆盖supportedInterfaceOrientations方法以限制支持的方向列表。通常,系统仅在窗口的根视图控制器或呈现的视图控制器上调用此方法以填充整个屏幕;子视图控制器使用由父视图控制器为其提供的窗口部分,不再直接参与有关支持哪些旋转的决策。应用程序的方向遮罩和视图控制器的方向遮罩的交点用于确定视图控制器可以旋转到哪个方向。
当可见视图控制器发生旋转时,将在旋转期间调用willRotate(to:duration :),willAnimateRotation(to:duration :)和didRotate(from :)方法。视图调整大小并由其父视图定位后,也会调用viewWillLayoutSubviews()方法。如果在发生方向更改时视图控制器不可见,则永远不会调用旋转方法。但是,当视图变为可见时,将调用viewWillLayoutSubviews()方法。您对此方法的实现可以调用statusBarOrientation方法来确定设备方向。
当方向改变时,将调用此方法,因此您可以在那里更新previewLayer.frame。
override func viewDidLayoutSubviews() {
var previewLayer:CALayer?
if let layer = previewLayer {
layer.frame = self.view.bounds
}
}
或
override func willRotate(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) {
var previewLayer:CALayer?
if let layer = previewLayer {
layer.frame = self.view.bounds
}
}