Ios 在didFinishPickingMediaWIthInfo中拍摄照片并尝试取消预览
在我的应用程序上拍摄照片后,我试图取消预览。我只想按下快门按钮,然后弹回到显示Ios 在didFinishPickingMediaWIthInfo中拍摄照片并尝试取消预览,ios,objective-c,uiimagepickercontroller,Ios,Objective C,Uiimagepickercontroller,在我的应用程序上拍摄照片后,我试图取消预览。我只想按下快门按钮,然后弹回到显示UIImagePickerController的UIViewController,而不显示图像预览、“重拍”和“使用照片”按钮。我正在使用以下代码: - (IBAction)pushTakePhoto:(id)sender { self.picker = [[UIImagePickerController alloc] init]; self.picker.delegate = self; s
UIImagePickerController
的UIViewController,而不显示图像预览、“重拍”和“使用照片”按钮。我正在使用以下代码:
- (IBAction)pushTakePhoto:(id)sender {
self.picker = [[UIImagePickerController alloc] init];
self.picker.delegate = self;
self.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.picker.cameraDevice=UIImagePickerControllerCameraDeviceFront;
UIImage *catEars = [UIImage imageNamed:@"cameraoverlay"];//320*101
UIImageView *overlayImageView = [[UIImageView alloc] initWithImage:catEars];
CGRect screenRect = [[UIScreen mainScreen] bounds];
self.earsX = screenRect.size.width/2-overlayImageView.frame.size.width/2;
self.earsY = 120;
self.earsWidth = overlayImageView.frame.size.width;
self.earsHeight = overlayImageView.frame.size.height;
//bar size is 40 at the top and the bottom one is 101
overlayImageView.frame=CGRectMake(self.earsX, self.earsY, self.earsWidth, self.earsHeight);
[self.picker setCameraOverlayView:overlayImageView];
[self presentViewController:self.picker animated:YES completion:NULL];
}
- (void)loadPhotoCaptured
{
UIImage *img = [[[self allImageViewsSubViews:[[[picker viewControllers]firstObject] view]] lastObject] image];
if (img)
{
[self imagePickerController:nil didFinishPickingMediaWithInfo:[NSDictionary dictionaryWithObject:img forKey:UIImagePickerControllerOriginalImage]];
}
else
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
}
- (NSMutableArray*)allImageViewsSubViews:(UIView *)view
{
NSMutableArray *arrImageViews=[NSMutableArray array];
if ([view isKindOfClass:[UIImageView class]])
{
[arrImageViews addObject:view];
}
else
{
for (UIView *subview in [view subviews])
{
[arrImageViews addObjectsFromArray:[self allImageViewsSubViews:subview]];
}
}
return arrImageViews;
}
在didfishpickingMediaWithInfo
中,我试图使用[self.picker dismissViewControllerAnimated:YES completion:nil]代码>但是它没有影响。谁能给我指点一下怎么做
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[self.picker dismissViewControllerAnimated:YES completion:nil];
}
- (void)loadPhotoCaptured
{
UIImage *img = [[[self allImageViewsSubViews:[[[picker viewControllers]firstObject] view]] lastObject] image];
if (img)
{
[self imagePickerController:nil didFinishPickingMediaWithInfo:[NSDictionary dictionaryWithObject:img forKey:UIImagePickerControllerOriginalImage]];
}
else
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
}
- (NSMutableArray*)allImageViewsSubViews:(UIView *)view
{
NSMutableArray *arrImageViews=[NSMutableArray array];
if ([view isKindOfClass:[UIImageView class]])
{
[arrImageViews addObject:view];
}
else
{
for (UIView *subview in [view subviews])
{
[arrImageViews addObjectsFromArray:[self allImageViewsSubViews:subview]];
}
}
return arrImageViews;
}
是否确实已使用精确签名实现了该方法:-(void)imagePickerController:(UIImagePickerController*)picker完成了PickingMediaWithInfo:(NSDictionary*)info
?
因为这两个[self dismissViewControllerAnimated:YES completion:nil]代码>和[self.picker dismissViewControllerAnimated:YES completion:nil]代码>应在您的情况下关闭选择器控制器。在viewDidLoad中添加此代码
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadPhotoCaptured) name:@"_UIImagePickerControllerUserDidCaptureItem" object:nil];
- (void)loadPhotoCaptured
{
UIImage *img = [[[self allImageViewsSubViews:[[[picker viewControllers]firstObject] view]] lastObject] image];
if (img)
{
[self imagePickerController:nil didFinishPickingMediaWithInfo:[NSDictionary dictionaryWithObject:img forKey:UIImagePickerControllerOriginalImage]];
}
else
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
}
- (NSMutableArray*)allImageViewsSubViews:(UIView *)view
{
NSMutableArray *arrImageViews=[NSMutableArray array];
if ([view isKindOfClass:[UIImageView class]])
{
[arrImageViews addObject:view];
}
else
{
for (UIView *subview in [view subviews])
{
[arrImageViews addObjectsFromArray:[self allImageViewsSubViews:subview]];
}
}
return arrImageViews;
}
然后实现这个方法
- (void)loadPhotoCaptured
{
UIImage *img = [[[self allImageViewsSubViews:[[[picker viewControllers]firstObject] view]] lastObject] image];
if (img)
{
[self imagePickerController:nil didFinishPickingMediaWithInfo:[NSDictionary dictionaryWithObject:img forKey:UIImagePickerControllerOriginalImage]];
}
else
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
}
- (NSMutableArray*)allImageViewsSubViews:(UIView *)view
{
NSMutableArray *arrImageViews=[NSMutableArray array];
if ([view isKindOfClass:[UIImageView class]])
{
[arrImageViews addObject:view];
}
else
{
for (UIView *subview in [view subviews])
{
[arrImageViews addObjectsFromArray:[self allImageViewsSubViews:subview]];
}
}
return arrImageViews;
}
试一试
- (void)loadPhotoCaptured
{
UIImage *img = [[[self allImageViewsSubViews:[[[picker viewControllers]firstObject] view]] lastObject] image];
if (img)
{
[self imagePickerController:nil didFinishPickingMediaWithInfo:[NSDictionary dictionaryWithObject:img forKey:UIImagePickerControllerOriginalImage]];
}
else
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
}
- (NSMutableArray*)allImageViewsSubViews:(UIView *)view
{
NSMutableArray *arrImageViews=[NSMutableArray array];
if ([view isKindOfClass:[UIImageView class]])
{
[arrImageViews addObject:view];
}
else
{
for (UIView *subview in [view subviews])
{
[arrImageViews addObjectsFromArray:[self allImageViewsSubViews:subview]];
}
}
return arrImageViews;
}
希望在其他人发现有用时发布此消息<代码>[self.picker dismissViewControllerAnimated:是完成:无]
可以工作,并且必须放置在-(无效)imagePickerController:(UIImagePickerController*)picker完成了与信息的PickingMediaWithInfo:(NSDictionary*)信息
,但是如果您使用默认的相机控件,则在调用-(无效)imagePickerController:(UIImagePickerController*)之前,它将始终显示“Retake”和“Use Photo”(使用照片)picker没有用信息完成PickingMediaWithInfo:(NSDictionary*)信息。绕过它的方法是设置self.picker.showsCameraControls=NO
并在cameraOverlayView
中包含一个调用[self.picker takePicture]
的ui按钮。现在工作。谢谢大家试过了,但运气不好。从理论上讲,这不会忽略包含UIImagePickerController而不是UIImagePickerController本身的视图控制器吗?是否实现了-(void)ImagePickerController idCancel:(UIImagePickerController*)选择器?除了picker被传递给delegate方法外,不需要存储该方法的属性。你确定调用了该方法吗?实际上,在按下“使用照片”之前不会调用该方法。也许我需要告诉应用程序在不按下“使用照片”的情况下自动使用照片,然后调用该方法,并将其关闭。这就是重点。使用UIImagePickerController的整个想法是用户拾取/拍摄照片并按“使用照片”进行确认。如果您想以另一种方式处理它,我建议您自己实现Photo Controller,或者从GitHub的实现中选择一个。哦,刚刚修复了它。必须设置self.picker.showsCameraControls=NO;然后在调用[self.picker takePicture]的自定义UIImagePickerController中放置一个UIButton;这将解除控制器,但不会调用-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)信息,因此无法保存照片。我喜欢您使用私人通知的方式,并建议他人使用。
- (void)loadPhotoCaptured
{
UIImage *img = [[[self allImageViewsSubViews:[[[picker viewControllers]firstObject] view]] lastObject] image];
if (img)
{
[self imagePickerController:nil didFinishPickingMediaWithInfo:[NSDictionary dictionaryWithObject:img forKey:UIImagePickerControllerOriginalImage]];
}
else
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
}
- (NSMutableArray*)allImageViewsSubViews:(UIView *)view
{
NSMutableArray *arrImageViews=[NSMutableArray array];
if ([view isKindOfClass:[UIImageView class]])
{
[arrImageViews addObject:view];
}
else
{
for (UIView *subview in [view subviews])
{
[arrImageViews addObjectsFromArray:[self allImageViewsSubViews:subview]];
}
}
return arrImageViews;
}