Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在didFinishPickingMediaWIthInfo中拍摄照片并尝试取消预览_Ios_Objective C_Uiimagepickercontroller - Fatal编程技术网

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;
}