如何讓'AVCaptureVideoPreviewLayer'以橫向顯示正確顯示?它在縱向上工作正常,但不旋轉,並且在父視圖控制器處於橫向方向時顯示旋轉的相機捕捉。AVCaptureVideoPreviewLayer風景取向
回答
首先,答案
- (void)viewWillLayoutSubviews {
_captureVideoPreviewLayer.frame = self.view.bounds;
if (_captureVideoPreviewLayer.connection.supportsVideoOrientation) {
_captureVideoPreviewLayer.connection.videoOrientation = [self interfaceOrientationToVideoOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
}
- (AVCaptureVideoOrientation)interfaceOrientationToVideoOrientation:(UIInterfaceOrientation)orientation {
switch (orientation) {
case UIInterfaceOrientationPortrait:
return AVCaptureVideoOrientationPortrait;
case UIInterfaceOrientationPortraitUpsideDown:
return AVCaptureVideoOrientationPortraitUpsideDown;
case UIInterfaceOrientationLandscapeLeft:
return AVCaptureVideoOrientationLandscapeLeft;
case UIInterfaceOrientationLandscapeRight:
return AVCaptureVideoOrientationLandscapeRight;
default:
break;
}
NSLog(@"Warning - Didn't recognise interface orientation (%d)",orientation);
return AVCaptureVideoOrientationPortrait;
}
我遇到幾個SO帖子在這個問題上,並沒有找到任何簡單的解釋,所以我想我會分享我自己的。
如果按照蘋果的樣品就不管了,你就當你旋轉你的iOS設備爲橫向
- Capture將出現旋轉(好像你拿着相機拍攝的90度運行到兩個潛在的問題關閉)
- 它不會跨越其設定界限完全
這裏的問題是,「CALayer的」不支持自動旋轉,因此,不同於「的UIView」你添加爲子視圖,它贏得當它的父'UIView'旋轉時不會旋轉。因此,每次父視圖的邊界發生更改時,都必須手動更新其框架(不是父視圖的框架,因爲框架在旋轉後保持不變)。這是通過在容器視圖控制器中重寫'viewWillLayoutSubviews'來實現的。其次,您應該使用'videoOrientation'屬性來告知AVFoundation有關方向,以便正確執行預覽。
希望這會有所幫助。
除了viewWillLayoutSubviews(),您還必須實現didRotateFromInterfaceOrientation()。
這是因爲如果設備從縱向模式旋轉到縱向模式(顯然是出於效率原因),子視圖佈局將不會更新。
override func viewWillLayoutSubviews() {
self.previewLayer.frame = self.view.bounds
if previewLayer.connection.isVideoOrientationSupported {
self.previewLayer.connection.videoOrientation = self.interfaceOrientation(toVideoOrientation: UIApplication.shared.statusBarOrientation)
}
}
func interfaceOrientation(toVideoOrientation orientation: UIInterfaceOrientation) -> AVCaptureVideoOrientation {
switch orientation {
case .portrait:
return .portrait
case .portraitUpsideDown:
return .portraitUpsideDown
case .landscapeLeft:
return .landscapeLeft
case .landscapeRight:
return .landscapeRight
default:
break
}
print("Warning - Didn't recognise interface orientation (\(orientation))")
return .portrait
}
// SWIFT 3換算,
這完美地工作_except_在相機不顯示並且由viewDidLoad()運行的情況下,由於previewLayer可能還不存在,它引入了各種各樣的問題。因此,以上@neoneye的答案應該被認爲是正確的。 –
Swift3
func updateVideoOrientation() {
guard let previewLayer = self.previewLayer else {
return
}
guard previewLayer.connection.isVideoOrientationSupported else {
print("isVideoOrientationSupported is false")
return
}
let statusBarOrientation = UIApplication.shared.statusBarOrientation
let videoOrientation: AVCaptureVideoOrientation = statusBarOrientation.videoOrientation ?? .portrait
if previewLayer.connection.videoOrientation == videoOrientation {
print("no change to videoOrientation")
return
}
previewLayer.frame = cameraView.bounds
previewLayer.connection.videoOrientation = videoOrientation
previewLayer.removeAllAnimations()
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: nil, completion: { [weak self] (context) in
DispatchQueue.main.async(execute: {
self?.updateVideoOrientation()
})
})
}
extension UIInterfaceOrientation {
var videoOrientation: AVCaptureVideoOrientation? {
switch self {
case .portraitUpsideDown: return .portraitUpsideDown
case .landscapeRight: return .landscapeRight
case .landscapeLeft: return .landscapeLeft
case .portrait: return .portrait
default: return nil
}
}
}
完美。 **謝謝!** –
- 1. iPad風景取向
- 2. UILabel風景取向
- 3. UIImagePickerController和風景取向
- 4. 支持風景取向
- 5. cocos2d和cocosbuilder風景取向
- 6. BAD_ACCESS雖然風景取向
- 7. 檢測景觀風景取向變化
- 8. AVCaptureMovieFileOutput風景方向
- 9. iOS 6風景和人像取向
- 10. 風景取向,半視圖。 Swift
- 11. HTML應用程序的風景取向
- 12. iPhone Safari風景取向CSS問題
- 13. iPad Apps的風景和人像取向
- 14. AVCaptureVideoPreviewLayer,視頻方向卡住
- 15. 方向鎖定到風景
- 16. SpriteKit默認風景方向
- 17. 切換到風景方向
- 18. AVCaptureVideoPreviewLayer
- 19. 從風景到縱向的屏幕取向不起作用
- 20. 方向變化從風景到風景模式stra 012作響
- 21. 如何從AVCaptureVideoPreviewLayer獲取UIImage?
- 22. 方向AVCaptureVideoPreviewLayer的響應不正確
- 23. 改變AVCaptureVideoPreviewLayer方向的問題
- 24. 使用Sencha Touch 2的iPad上的風景取向2
- 25. 斯威夫特集合視圖的風景取向
- 26. 停止UIToolbar消失在風景取向 - iPad
- 27. 以當前風景取向開始iPad應用程序
- 28. LibGDX風景取向X和Y作爲位置0,0
- 29. 風景模式的方向問題
- 30. IReport結合風景和肖像方向
覆蓋viewWillLayoutSubviews()解決我的問題!謝謝。 – iForests
太棒了!但是我必須通過調用self.view.setNeedsLayout()來調用will-或didRotateToInterfaceOrientation()才能獲得名爲 –
的viewWillLayoutSubviews。此方法對我很有幫助。感謝隊友 –