ios - 如何设置相机 View 以填充其父 View

标签 ios swift uiview ios8 avcapturesession

我不知道这个问题是关于自动布局还是我做错了什么。
我有一个 UIViewController 和一个 UIView 在里面。
我正在使用 AVCaptureSession 将相机 View 放入其中。
问题是,当我在 View 内部加载相机 View 时,它不会填充该 View ,因此我在左侧和右侧有间隙。
我想要做的是用相机填充整个 UIView
这是我的代码:

...
@IBOutlet weak var camView: UIView!
var previewLayer    : AVCaptureVideoPreviewLayer!

override func viewDidLoad() {
...
previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.frame = self.camView.layer.bounds
self.camView.layer.addSublayer(previewLayer)
session.startRunning()

最佳答案

您需要在 subview 布局后进行设置。在 viewDidLayoutSubviews

Add view

Add outlet

Add Constraints

-(void)viewDidLayoutSubviews
{
    [self setupAVCapture];
}


- (void)setupAVCapture {
    NSError *error = nil;

    AVCaptureSession *session = [AVCaptureSession new];
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
        [session setSessionPreset:AVCaptureSessionPreset640x480];
    else
        [session setSessionPreset:AVCaptureSessionPresetPhoto];

    // Select a video device, make an input
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

    if ([session canAddInput:deviceInput])
        [session addInput:deviceInput];

    AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
        [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

    previewLayer.frame = self.camView.bounds;
    [self.camView.layer addSublayer:previewLayer];
    [session startRunning];
}

您可能发生的情况是,您的 viewDidLoad 中的边界尚未准确设置,因为 subview 尚未根据其约束进行布局。当您改为在 viewDidLayoutSubviews 中为 previewLayer 设置框架时,它将采用正确的方向。不过要小心,您还需要调整旋转预览,以及修改我使用的代码。抱歉,它不是 swift,但这应该无关紧要。只需将您的实例化和设置移动到 viewDidLayoutSubviews

因此对于您的代码,您应该这样做:

override func viewDidLayoutSubviews() {
...
previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.frame = self.camView.layer.bounds
self.camView.layer.addSublayer(previewLayer)
session.startRunning()

关于ios - 如何设置相机 View 以填充其父 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29534775/

相关文章:

ios - 核心数据终止错误

另一个 View 范围内的 iOS View

ios - 以编程方式设置约束与在 IB 中设置约束不同?

ios - 从 iCloud 删除核心数据失败

ios - 为什么applicationFrame高度为460时窗口480的高度?

ios - 使用 Instruments 识别 ScrollView 帧丢失

ios - 在方向更改时自动缩放 UIView 以按比例缩放以适合父 View

ios - Xcode 8/swift 3 : "Expression of type UIViewController? is unused" warning

ios - 快速显示和隐藏导航栏

objective-c - Objective-C 类型的 Swift 2 协议(protocol)扩展和一致性