我的应用只是风景 . 我将这样呈现AVCaptureVideoPreviewLayer:
self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[self.previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[self.previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
NSLog(@"previewView: %@", self.previewView);
CALayer *rootLayer = [self.previewView layer];
[rootLayer setMasksToBounds:YES];
[self.previewLayer setFrame:[rootLayer bounds]];
NSLog(@"previewlayer: %f, %f, %f, %f", self.previewLayer.frame.origin.x, self.previewLayer.frame.origin.y, self.previewLayer.frame.size.width, self.previewLayer.frame.size.height);
[rootLayer addSublayer:self.previewLayer];
[session startRunning];
self.previewView的框架为(0,0,568,320),这是正确的 . self.previewLayer记录一个(0,0,568,320)的帧,这在理论上是正确的 . 但是,相机显示在横向屏幕中间显示为纵向矩形,并且相机预览图像的方向错误90度 . 我究竟做错了什么?我需要在横屏模式下以全屏显示相机预览图层,并且图像应正确定向 .
17 回答
默认摄像机方向为横向左侧(左侧是主页按钮) . 你需要在这里做两件事:
1-将previewLayer框架更改为:
您需要将预览图层框架设置为屏幕边界,以便在屏幕旋转时预览图层的框架发生更改(您不能使用根视图的框架,因为它不会随着旋转而改变,而是根视图的边界做) . 在您的示例中,您将预览层框架设置为我看不到的previewView属性 .
2-您需要通过设备的旋转来旋转预览图层连接 . 在viewDidAppear中添加此代码:
希望这能解决它 .
完全披露:这是一个简化版本,因为您不关心Landscape Right还是Landscape .
BEST ANSWER FOR SWIFT 2.2 AND XCODE 7.3
我们不能用
因为
UIInterfaceOrientation != AVCaptureVideoOrientation
但是我们可以通过以下代码测试值...并且这项工作 .
API似乎有所改变 .
videoOrientation
现在是预览图层connection
属性的属性 . 此外,无需使用开关 . Swift 3.0的答案:对于那些正在全功能相机预览中苦苦挣扎的人 . 这是 生产环境 代码 . 当然,缺点是方向改变时滞后 . 如果有人有更好的解决方案来克服这个,请分享
由于使用上述解决方案存在弃用和转换警告,并且设置videoOrientation似乎在iOS7中不起作用,因此我在AVCaptureVideoPreviewLayer的getter中检查了方向,如下所示:
适用于Swift 4,Xcode 9:
这里要注意的一个微妙之处是
UIDeviceOrientation.landscapeRight
与AVCaptureVideoOrientation.landscapeLeft
一起使用 .另一个景观案例同样不匹配 . 这是故意的,并且容纳了UIKit和AVFoundation之间不幸的不匹配 . 如果您通过匹配名称来匹配案例,则它将无效,并且您的视频将在横向配置中颠倒 .
嘿伙计们感谢所有的答案和反馈,我遇到了这个,因为我正在开发一个快速的应用程序 . 您可以使用以下代码将相机与设备一起旋转:
希望这可以帮助!
从
UIDeviceOrientation
到AVCaptureVideoOrientation
的正确映射是必要的 .如果您的应用支持
device rotation
,则还需要resizing preview.frame
,并且应从viewDidLayoutSubviews()
和viewWillTransition()
调用此func
.首先,我们需要创建AVCaptureVideoPreviewLayer并:
设置了它的videoGravity(在我的情况下,我使用一个小视图来获取视频输出) .
设置框架 .
我也是面对同样的这是为了修复我的相机方向
修理相机
Maselko's answer几乎为我工作,除了状态栏方向翻转然后相机输出显示颠倒 . 当状态栏翻转时,我've addressed that issue by re-calling Maselko'的逻辑 .
这是我修改过的Maselko解决方案(在ios12 / swift4上测试):
选择的答案适用于Swift 4.2 - Xcode 10.0 - iOS 12.0:
不要忘记从UIInterfaceOrientation到AVCaptureVideoOrientation的映射
它在iOS 8到11.1中对我没有任何问题的唯一方法是这样做,我应该提一下,在我的情况下,我只在横向模式下加载我的应用程序,但它应该在所有方向上工作 . (顺便说一句,你可以叠加通过imageview手动摄像头或任何你想要的方式容易)
@Maselko的回答是正确的,但有一点:您应该使用
UIApplication.shared.statusBarOrientation
而不是UIDevice.current.orientation
,因为设备方向是您的设备定位的方式 . 当您的设备处于横向状态但您的UI不支持该方向时(例如,当我制作仅限风景的相机应用并在设备处于纵向位置时启动视图),它会中断 .这是我使用Swift 4的解决方案 .
它很短,对我来说很漂亮 .