【发布时间】:2019-01-22 05:59:57
【问题描述】:
我有一个视图控制器,嵌入在标签栏控制器中,除其他外,它在 UIView 中显示 AVCaptureVideoPreviewLayer。
当设备旋转时,我希望视图控制器随之旋转——除了前面提到的 UIView。
然而,与this related question 不同,我不只是在视图控制器中旋转/转换我的其他视图。其他视图需要使用其配置的自动布局旋转行为。
我尝试了几件事,包括简单地将视频方向设置为纵向:
previewLayer.connection.videoOrientation = .portrait
将 UIView 提取到单独的视图控制器,将该视图控制器嵌入到原始视图控制器中,并设置其 autoRotation 属性
override var shouldAutorotate: Bool {
return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
但后来我了解到here iOS 只查看顶级视图控制器的这些属性。
根据我的所有尝试,视频预览与视图控制器的其余部分一起旋转 - 最终侧身。
唯一可行的,但很hacky,有时会导致视频预览错位,是这个
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
if let videoPreviewLayerConnection = previewLayer.connection {
if let newVideoOrientation = AVCaptureVideoOrientation(rawValue: UIApplication.shared.statusBarOrientation.rawValue) {
videoPreviewLayerConnection.videoOrientation = newVideoOrientation
}
}
}
}
我基本上需要this question的反义词。
如何强制视频预览不旋转,但同时允许视图控制器的其余部分正常旋转?(与 iOS 相机应用程序的行为相同,只是其他 UI 元素正常旋转而不是90°旋转变换)
【问题讨论】:
标签: ios swift uiview uiviewcontroller avfoundation