iPhone:以编程方式拍照

时间:2009-10-30 00:16:52

标签: iphone uiimagepickercontroller iphone-sdk-3.1

我正在尝试使用OS 3.1中的UIImagePickerController接口,使用cameraOverlayView和takePicture,但我显然无法理解它是如何工作的,所以我没有得到我想要的行为。

我想要做的是打开相机并自动拍照,而无需让用户与拣货员互动或编辑图像。所以我将UIImagePickerController子类化(类似于http://github.com/pmark/Helpful-iPhone-Utilities/tree/master/BTL%20Utilities/中的示例)并关闭所有控件:

- (void)displayModalWithController:(UIViewController*)controller animated:(BOOL)animated {
self.sourceType = UIImagePickerControllerSourceTypeCamera;
self.showsCameraControls = NO;
self.navigationBarHidden = YES;
self.toolbarHidden = YES;
    // Setting the overlay view up programmatically.
ipView = [[ImagePickerView alloc] init];
self.cameraOverlayView = ipView;
[controller presentModalViewController:self animated:NO];
}

在overlayView中,我设法强制UIImagePickerController的takePicture方法触发(我知道这个,因为我可以NSLog它,我听到相机拍照的声音)。 overlayView显示就好了。但是,委托方法didFinishPickingMediaWithInfo:永远不会被调用,并且也不会调用imagePickerControllerDidCancel。

那么,我如何通过覆盖takePicture方法来获取调用的委托方法,还是保存图片? (我不知道如何在这里捕捉图片数据,谷歌似乎让我失望了)。我不禁觉得我无法理解UIImagePickerController的内容是如何工作的,但文档并没有太大的帮助:

e.g:

“您可以提供自定义叠加视图以显示自定义拍照界面,您可以开始从代码中拍摄照片。除了提供的默认控件之外,还可以显示自定义叠加视图通过图像选择器界面。“

或来自showCameraControls:

“如果将此属性设置为NO并提供自己的自定义控件,则可以在取消图像选取器界面之前拍摄多张照片。” - 如何解除选择器界面?

注意:在IB中正确设置了委托,因此不是问题。

感谢您提供的任何帮助!

3 个答案:

答案 0 :(得分:2)

我发现你在调用takePicture之前必须等待“足够长时间”,否则它就会默默地失败。我没有一个很好的答案,如何确定总是有效的“足够长”的最小值,但如果你设置一个计时器并等待五或十秒你应该没问题。如果它直接从takePicture或通过代表返回某种“我还没准备好拍照,抱歉”错误会很好,但据我所知,它不会。

答案 1 :(得分:0)

作为对我自己的问题的更新:事实证明我过早地尝试使用takePicture。当我将动作移动到叠加层上的按钮并从该按钮发送takePicture时(一旦拾取器以模态方式呈现),委托方法就会按原样触发。我不知道我想要的是否可以实现 - 无需自动按下该按钮即可拍摄图像 - 但如果是,则可能必须通过在我尝试使用它之后的某个时间发送takePicture来完成。

答案 2 :(得分:0)

- (无效)imageMethod:(ID)发送方{ imagePickerController = [[UIImagePickerController alloc] init]; imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

imagePopover=[[UIPopoverController alloc]initWithContentViewController:imagePickerController];
[imagePopover presentPopoverFromRect:importButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}