相机和自定义视图

40

我的应用程序使用相机,我想在相机预览上添加覆盖层。例如,当我使用相机时,我想使用一个图片框架,并且我想为相机操作添加自定义工具栏。请帮助我完成这个任务。


尝试这个:https://dev59.com/J14c5IYBdhLWcg3wiKuU#34433045 - Meet Doshi
4个回答

57
你可能正在尝试使用UIImagePickerController。但我知道一种解决方案可以帮助你解决问题。你可以使用AVCamCaptureManager和AVCamRecorder类轻松实现它。苹果在其开发者网站上构建了一个演示程序这里,名为AVCam。简单来说,当你点击打开相机时,它会调用负责打开iPhone摄像头、录制视频或捕获音频的类和方法。它调用的是UIImagePickerController调用的相同类。因此,你的相机将打开并开始输入。
现在,如果你打开AVCam项目的xib文件,你会发现一个小的UIView对象。这个视图负责显示相机的输入。你可以调整该视图的大小,并在那么大的区域内显示相机的输入。你还可以根据自己的选择放置框架图像。
当我想要调整相机输入的大小并捕获照片时,这对我有效。我希望它也能解决你的问题。

我尝试将AVCamPreviewView调整为正方形。视图正确地调整大小,但在AVCamPreviewView内部,摄像头的反馈显示在一个小矩形内。好像某个地方设置了宽高比,但我找不到覆盖它的位置。 - Katedral Pillon
@KatedralPillon,我也遇到了同样的问题。你找到解决方案了吗? - Roshit
好的。我已经解决了纵横比填充部分。[(AVCaptureVideoPreviewLayer *)[self.previewView layer] setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 这确保了所显示的预览被裁剪成我们想要的样子。但输出视频还没有被裁剪。我猜我缺少了什么。 - Roshit
1
@Roshit https://dev59.com/J14c5IYBdhLWcg3wiKuU - Katedral Pillon

41
从代码中创建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];

3
在发布复制和粘贴的样板/原文回答时要小心,这些都很容易被社区标记为“垃圾邮件”。如果你这样做,通常意味着这些问题是重复的,所以请将它们标记为重复。请注意保持原意,使翻译易于理解,但不要添加解释或其他内容。 - Kev
@Kev:哦,好的,抱歉,我会处理的。如何将问题标记为重复?我在提出的标记状态中没有看到该选项? - Oliver
@Oliver - 可以选择仅发表评论,例如“可能是这个问题的重复 <link_to_duplicate>” - RyBolt
2
当我直接设置cameraOverlayView属性时,我在自动布局方面遇到了问题。相反,我不得不使用[self.picker.cameraOverlayView addSubview:self.overlay.view] - Hari Honor
如何处理覆盖层中的方法调用以避免出现此消息:不建议在已分离的视图控制器上呈现视图控制器。 - Luke Irvin
@LukeIrvin:你好,很抱歉目前无法帮助你:我从未遇到过这个错误,并且由于需要更换我的Mac以升级到iOS6(没有足够的资金),我没有安装最新的XCode和SDK,我想这可能是消息来源。 - Oliver

4
请阅读UIImagePickerController 类参考文档,其中有与此相关的属性,特别是cameraOverlayViewshowsCameraControls属性。
通过这些属性,您可以隐藏控件,提供自定义的叠加视图,并将子视图添加到此自定义视图中以添加自定义按钮、框架等。请注意保留HTML标记。

0

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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接