我需要一个自定义相机,底层作为相机,上面有一层作为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;
我使用此代码UIView
(AVFoundation
)在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编程很陌生。请帮帮我,我绝望了。
答案 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);
}
}