15

我注意到在 OS 3.1 中,您可以使用

cameraOverlayView

但是,我还注意到,当我只想在预览阶段显示它时,通过此方法添加视图也会显示整个 UIImagePicker 显示的视图。

有没有办法让这仅在预览期间发生?我不希望它在打开快门动画或询问您是要使用图像还是重拍的屏幕上出现。

4

4 回答 4

19

我只是想在不摆弄子视图的情况下展示另一种可能性。CameraPicker 中的更改有系统通知。它们也没有记录(作为子视图结构)。因此,它们也可能会发生变化。但是你得到了它们。

您可以不使用名称注册它们:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(notificationReceived:) name: nil object: nil];

我们在这里收到一些有趣的(自我解释的)通知:

PLCameraControllerPreviewStartedNotification
PLCameraViewIrisAnimationWillBeginNotification
PLCameraViewIrisAnimationDidEndNotification

Recorder_DidStartPreviewing
Recorder_SourceStarted
Recorder_WillCapturePhoto
Recorder_DidCapturePhoto
Recorder_PhotoStillImageSampleBufferReady
Recorder_DidStopPreviewing

_UIImagePickerControllerUserDidCaptureItem // Photo was taken, preview is shown
_UIImagePickerControllerUserDidRejectItem  // Repeat was pressed, camera is shown again 

您可以使用它们来触发您的叠加视图隐藏状态或其他任何内容。

于 2012-01-17T16:50:52.673 回答
18

我已经为您找到了一种方法来达到预期的结果,尽管它有点......不是那么标准。:)

UIImagePickerController这个想法是重新排列结构使用中内部视图的顺序。

好的,所以我们创建一个UIImagePickerController对象,对其进行初始化并为其添加一个覆盖视图。请注意!该UIView对象(UIImageView在示例代码中)从一开始就被隐藏了。不要错过。最后,我们将图像选择器控制器呈现为模态视图控制器。这段代码应该在你的某个地方applicationDidFinishLaunching:viewWillAppear:或者类似的适合启动方法的地方。

UIImagePickerController *anImagePickerController = [UIImagePickerController new];
anImagePickerController.delegate = self;
anImagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

UIImageView *anImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Watermark.png"]];
anImageView.frame = CGRectMake(0, 1, anImageView.image.size.width, anImageView.image.size.height);
anImageView.hidden = YES;
anImagePickerController.cameraOverlayView = anImageView;

[viewController presentModalViewController:anImagePickerController animated:NO];
[anImagePickerController release];

[NSTimer scheduledTimerWithTimeInterval:0.1
                                 target:self
                               selector:@selector(timerFireMethod:)
                               userInfo:anImageView
                                repeats:YES];
[anImageView release];

在覆盖视图 ( anImageView) 发布之前,会创建一个,使用( property) 进行NSTimer初始化 并立即安排。这是它调用的方法:anImageViewNSTimer userInfo

- (void)timerFireMethod:(NSTimer*)theTimer {
    UIView *cameraOverlayView = (UIView *)theTimer.userInfo;
    UIView *previewView = cameraOverlayView.superview.superview;

    if (previewView != nil) {
        [cameraOverlayView removeFromSuperview];
        [previewView insertSubview:cameraOverlayView atIndex:1];

        cameraOverlayView.hidden = NO;

        [theTimer invalidate];
    }
}

整个NSTimer事情都被添加到流程中,以确保重新排序工作UIImagePickerController将在完全准备好时发生。

就是这个。它有效,它不是标准的,它是粗糙和快速的。再次随意优化并使其“更正确”(哦,请这样做,我的目的是向您展示方式)。

于 2010-01-23T12:56:04.810 回答
6

实际上,我正在尝试做同样的事情,并且通过这篇博客文章发现了一个更简单的方法:http ://www.alexcurylo.com/blog/2009/06/18/uiimagepickercontroller-in-3-0 /

由于 UIImagePickerController 可以调用 UINavigatorControllerDelegate,因此在显示图像选择器之前会调用下面的方法。

这是重要的代码:

 - (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{
   if (!viewController)
   return;

   UIView* controllerViewHolder = viewController.view;
   UIView* controllerCameraView = [[controllerViewHolder subviews] objectAtIndex:0];
   UIView* controllerPreview = [[controllerCameraView subviews] objectAtIndex:0];
   [controllerCameraView insertSubview:self.overlayView aboveSubview:controllerPreview];
}

希望有帮助。

于 2010-02-28T19:04:17.500 回答
-2

当您构建选取器时,将叠加层添加到选取器 (picker.cameraOverlayView = myView)。

叠加层不会出现在拍摄的照片中。就像它说的那样,它只是一个覆盖视图。

您可以在拍照之前删除覆盖视图(takePicture方法)并再次添加视图imagePickerController:didFinishPickingMediaWithInfo:

于 2010-01-17T17:52:17.977 回答