【问题标题】:Taking a photo and trying to dismiss the preview in didFinishPickingMediaWIthInfo拍照并尝试关闭 didFinishPickingMediaWIthInfo 中的预览
【发布时间】:2015-03-17 14:17:08
【问题描述】:

在我的应用上拍摄照片后,我试图关闭预览。我只想按下快门按钮,然后弹回显示UIImagePickerControllerUIViewController,而不显示图像预览和“重拍”和“使用照片”按钮。我正在使用此代码:

- (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];


}

didFinishPickingMediaWIthInfo 我正在尝试使用[self.picker dismissViewControllerAnimated:YES completion:nil]; 但是它没有任何影响。谁能给我一些关于如何去做的指示?

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    [self.picker dismissViewControllerAnimated:YES completion:nil];

}

【问题讨论】:

  • 试过了,但没有运气。这在理论上不会关闭包含 UIImagePickerController 而不是 UIImagePickerController 本身的视图控制器吗?
  • 您是否实施了- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker?除了将picker传递给委托方法外,无需为此存储属性。

标签: ios objective-c uiimagepickercontroller


【解决方案1】:

在 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)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 所以将无法保存照片。
  • 我喜欢您使用私人通知的方式并建议其他人使用。
【解决方案2】:

您确定您已经实现了具有精确签名的方法:- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info? 因为[self dismissViewControllerAnimated:YES completion:nil];[self.picker dismissViewControllerAnimated:YES completion:nil]; 在您的情况下都应该关闭选择器控制器。

【讨论】:

  • 你确定调用了这个方法吗?
  • 实际上在按下“使用照片”之前它不会被调用..也许我需要以某种方式告诉应用程序在不按下“使用照片”的情况下自动使用照片,并且该方法将被调用并且它会关闭..
  • 这就是重点。用户选择/拍摄照片并通过按“使用照片”确认的使用 UIImagePickerController 的整个想法。如果您想以另一种方式处理它,我建议您自己实现 Photo Controller 或从 GitHub 的实现中选择一个。
  • 哦,刚刚修好了。必须设置 self.picker.showsCameraControls=NO;然后将一个 UIButton 放入调用 [self.picker takePicture] 的自定义 UIImagePickerController 中;
【解决方案3】:

想发布这个以防其他人觉得它有用。 [self.picker dismissViewControllerAnimated:YES completion:nil]; 确实有效,必须放在 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 中,但是如果您使用默认相机控件,它将始终显示“重拍”和“使用照片”,然后再调用 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo :(NSDictionary *) 信息。绕过它的方法是设置self.picker.showsCameraControls=NO; 并在调用[self.picker takePicture]cameraOverlayView 中包含UIButton。现在工作。谢谢大家

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2014-11-03
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多