相机叠加视图 - 仅供预览?

mac*_*_55 15 iphone camera overlay uiimagepickercontroller

我注意到在OS 3.1中你可以用图像选择器添加叠加视图

cameraOverlayView
Run Code Online (Sandbox Code Playgroud)

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

有没有办法让这个只在预览期间发生?在开放式快门动画期间,或者询问您是否要使用图像或重拍时,我不希望它出现在那里.

cal*_*kus 18

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

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

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(notificationReceived:) name: nil object: nil];
Run Code Online (Sandbox Code Playgroud)

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

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 
Run Code Online (Sandbox Code Playgroud)

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


Iva*_*pan 17

我已经找到了一种方法让你达到预期的效果,虽然它有点......不太标准.:)

我们的想法是重新排列结构中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];
Run Code Online (Sandbox Code Playgroud)

在重叠视图(anImageView)被释放之前,NSTimer创建一个,用anImageView(NSTimer 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];
    }
}
Run Code Online (Sandbox Code Playgroud)

整个过程NSTimer被添加到流程中以确保重新排序工作将完全发生在UIImagePickerController将完全准备好的时候.

就是这个.它有效,它不标准,它粗糙而快速.再次随意优化并使其"更加"(哦,请做,我的目的是告诉你的方式).


小智 6

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

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

这是重要的代码:

 - (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];
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.