具有自定义视图的相机

Posted

技术标签:

【中文标题】具有自定义视图的相机【英文标题】:Camera with Custom View 【发布时间】:2011-11-30 03:37:47 【问题描述】:

我的应用程序使用相机,我想在相机预览上添加叠加层。比如我想在使用Camera的时候使用一个相框,也想为相机操作添加一个自定义栏。请帮助我做同样的事情。

【问题讨论】:

试试这个***.com/a/34433045/3908884 【参考方案1】:

您可能正在尝试使用 UIImagePickerController。但我知道这是解决您问题的一种方法。您可以使用 AVCamCaptureManager 和 AVCamRecorder 类轻松完成。 Apple 在其开发者网站here 上有一个演示程序。它被命名为 AVCam。简单来说就是当你点击打开相机时,它会调用负责打开iPhone相机并录制视频或捕获音频的类和方法。它调用 UIImagePickerController 调用的相同类。这样你的相机就会打开并开始接受输入。

现在,如果您打开该 AVCam 项目的 xib 文件,您会发现一个小的 UIView 对象。此视图负责显示相机的提要。您可以根据需要调整该视图的大小,并且相机的输入将显示在该区域中。您还可以根据自己的选择将框架图像放在它周围。

当我想调整相机输入源的大小并拍摄照片时,它对我有用。我希望它也对你有用。

【讨论】:

我尝试将AVCamPreviewView 调整为正方形。视图大小正确调整,但在AVCamPreviewView 内,摄像头馈送显示在一个小矩形内。就好像在某处设置了纵横比,但我找不到在哪里覆盖它。 @KatedralPillon 即使我刚刚遇到了同样的问题。你找到解决办法了吗? 好吧。我得到了纵横比填充它的一部分。 [(AVCaptureVideoPreviewLayer *)[self.previewView layer] setVideoGravity:AVLayerVideoGravityResizeAspectFill]; .. 这确保显示的预览被裁剪成我们想要的样子。但输出视频尚未裁剪。猜猜我错过了什么。 @Roshit ***.com/questions/27824481/…【参考方案2】:

从代码创建一个 UIImagePickerController,调整它的属性,在上面添加一个叠加层,然后用你的控制器,控制你想要在那个叠加层上的任何东西:自定义控件,叠加图像等等......

这给出了这样的东西:

self.picker = [[UIImagePickerController alloc] init];
self.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
self.picker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
self.picker.showsCameraControls = NO;
self.picker.navigationBarHidden = YES;
self.picker.toolbarHidden = YES;
self.picker.wantsFullScreenLayout = YES;

// Insert the overlay
self.overlay = [[OverlayViewController alloc] initWithNibName:@"Overlay" bundle:nil];
self.overlay.pickerReference = self.picker;
self.picker.cameraOverlayView = self.overlay.view;
self.picker.delegate = self.overlay;

[self presentModalViewController:self.picker animated:NO];

OverlayViewController 是您必须编写的控制器,以控制您添加到叠加层上的所有内容。

pickerReference 是您可以保留的属性,用于向相机发送订单。例如,您可以从来自放置在叠加层上的 UIButton 的 IBAction 调用以下内容:

[self.pickerReference takePicture];

【讨论】:

在发布多个问题的复制和粘贴样板/逐字答案时要小心,这些往往会被社区标记为“垃圾邮件”。如果您这样做,则通常意味着问题是重复的,因此请标记它们。 @Kev :哦,好的,抱歉,我会处理的。您如何将问题标记为重复?我在建议的标志状态中没有看到该选项? @Oliver - 可选择只发表评论,例如“可能与此问题重复 ” 我在直接设置 cameraOverlayView 属性时遇到了自动布局问题。相反,我不得不使用[self.picker.cameraOverlayView addSubview:self.overlay.view] 如何处理覆盖层中的方法调用以免收到此消息:不鼓励在分离的视图控制器上呈现视图控制器【参考方案3】:

阅读UIImagePickerController Class Reference,就在文档中……

对此有一些属性,尤其是cameraOverlayViewshowsCameraControls 属性。

因此您可以隐藏控件,提供自定义叠加视图,并在此自定义视图中添加子视图以添加自定义按钮、框架等。

【讨论】:

【参考方案4】:

来自 Oliver 的回答的 Swift 3 版本:

self.picker = UIImagePickerController()
self.picker.sourceType = .camera
self.picker.cameraCaptureMode = .photo
self.picker.cameraDevice = .rear
self.picker.showsCameraControls = false
self.picker.isNavigationBarHidden = true
self.picker.isToolbarHidden = true

// Insert the overlay
self.overlayViewController = self.storyboard?.instantiateViewController(withIdentifier: "Overlay") as! OverlayViewController

self.picker.cameraOverlayView = self.overlayViewController.view
self.picker.delegate = self.overlayViewController
self.navigationController?.present(self.picker, animated: true, completion: nil)

OverlayViewController 协议:

class OverlayViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate 

【讨论】:

以上是关于具有自定义视图的相机的主要内容,如果未能解决你的问题,请参考以下文章

是否可以自定义 android 的相机裁剪意图视图?

自定义视图中的 UIImagePickerController 不显示相机

自定义相机视图预览层加上大小的手机问题

iOS 6.1 中用于自定义相机视图的自动旋转

如何自定义相机视图并捕获叠加层中的部分?

android自定义相机拉伸surfaceview