[英]camera overlay view - just for preview?
我注意到在OS 3.1中你可以用图像选择器添加叠加视图
cameraOverlayView
但是,我还注意到,通过此方法添加视图还会显示UIImagePicker显示的整个时间视图,而我只想在预览阶段显示它。
有没有办法让这个只在预览期间发生? 在开放式快门动画期间,或者询问您是否要使用图像或重拍时,我不希望它出现在那里。
我只想在没有子视图的情况下展示另一种可能性。 有关于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
您可以使用它们来触发您的重叠视图隐藏状态或其他任何内容。
我已经找到了一种方法让你达到预期的效果,虽然它有点......不太标准。 :)
我们的想法是重新排列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
)之前,会创建一个NSTimer
,使用anImageView
( NSTimer
userInfo
属性)进行初始化并anImageView
安排。 这是它调用的方法:
- (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
完全准备就绪时,重新排序工作将完全发生。
就是这个。 它有效,它不标准,它粗糙而快速。 再次随意优化并使其“更加”(哦,请做,我的目的是告诉你的方式)。
实际上,我试图做同样的事情,我通过这篇博文发现了一个更简单的做法: 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];
}
希望有所帮助。
构建选择器时,将叠加层添加到选择器(picker.cameraOverlayView = myView)。
叠加层不会出现在拍摄的照片中。 就像它说的那样,它只是一个叠加视图。
您可以在拍照前删除叠加视图( takePicture
方法)并在imagePickerController:didFinishPickingMediaWithInfo:
再次添加视图imagePickerController:didFinishPickingMediaWithInfo:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.