使用AVCaptureVideoPreviewLayer的UIView没有调整

时间:2015-07-27 12:56:12

标签: ios objective-c iphone uiview avfoundation

我需要一个自定义相机,底层作为相机,上面有一层作为PNG图片,上面有一个洞,所以你可以通过这个洞看到相机的一部分。两个图层都应该是PNG照片的大小,符合屏幕的大小,并保持PNG的原始宽高比。

在故事板中,我有一个UIView来展示相机,还有一个UIImageView来展示它上面的PNG,两者都是自动布局到超级视图。

我已经设法通过使用此代码获得了正确的PNG(工作正常):

UIImage *passedImage = [UIImage imageNamed:self.photoTitle];
CGRect imageBounds = CGRectMake(0, 0, passedImage.size.width, passedImage.size.height);
self.imageView.frame = imageBounds;
[self.imageView setImage:passedImage];
self.imageView.contentMode = UIViewContentModeScaleAspectFit;

我使用此代码UIViewAVFoundation)在AVCaptureVideoPreviewLayer中显示了相机:

AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
CALayer *rootLayer = [self.cameraFeedView layer];
[rootLayer setMasksToBounds:YES];
CGRect frame = self.cameraFeedView.frame;
[previewLayer setFrame:frame];
previewLayer.frame = rootLayer.bounds;
[rootLayer insertSublayer:previewLayer atIndex:0];

这样我就可以根据需要在屏幕中央放置PNG,但是它背后的摄像头会扩展到屏幕的边界,同时我需要摄像头视图与图像大小相同,并且正好在它后面。 / p>

我尝试调整UIView的大小,与调整UIImageView的大小相同,但不是缩小视图以适应屏幕,而是获得PNG的原始大小(更大)而不是屏幕)并流出屏幕。

我试图解决这个问题很长一段时间但尚未找到答案。我对Objective-c编程很陌生。请帮帮我,我绝望了。

1 个答案:

答案 0 :(得分:0)

我已经解决了你的问题。

您希望在图像边界的确切区域上显示AVCaptureVideo,但在图像后面。所以我认为你正在尝试为视频准备一些框架功能。

这是解决方案。将图像设置为UIImage后,请调用此代码。你需要一个imageScale方法,我已经提到过这段代码了。

在这里,您的previewLayer大小将根据图像适合UIImageView进行设置。确保根据需要设置AspectFit图像。

//Get ratio of UIImage size on UIImageview.
CGSize sizeMade = [self imageScale];

//Change UIImageview frame according to image size.
float fHeight = passedImage.image.size.height*sizeMade.height;
float fWidth = passedImage.image.size.width*sizeMade.width;

CGRect tFrame = previewLayer.frame;
tFrame.size.height = fHeight;
tFrame.size.width = fWidth;
previewLayer.frame = tFrame;

获取图像比例与UIImageView的比率的函数。

- (CGSize)imageScale{

    CGFloat sx = _imageviewAboutToZoom.frame.size.width / _imageAboutToZoom.size.width;
    CGFloat sy = _imageviewAboutToZoom.frame.size.height / _imageAboutToZoom.size.height;
    CGFloat s = 1.0;
    switch (_imageviewAboutToZoom.contentMode) {
        case UIViewContentModeScaleAspectFit:
            s = fminf(sx, sy);
            return CGSizeMake(s, s);
            break;

        case UIViewContentModeScaleAspectFill:
            s = fmaxf(sx, sy);
            return CGSizeMake(s, s);
            break;

        case UIViewContentModeScaleToFill:
            return CGSizeMake(sx, sy);

        default:
            return CGSizeMake(s, s);
    }
}