Search code examples
iosobjective-cuiimagepickercontrollercamera-overlay

Using cameraOverlayView with UIImagePickerController


I have an app that uses the UIImagePickerController to take a picture. The problem is that I only want the camera option to be available and I understand that I need to hide the standard controls:

cameraUI.showsCameraControls=NO;

and use a cameraOverlayView to provide my own controls. I have had a look at Apple's PhotoPicker project already and my initial problem is how do I get an Overlay object onto my storyboard? I can't find such an object in the library.


Solution

  • Here is the code :

    toolBar=[[UIToolbar alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height-54, self.view.frame.size.width, 55)];
    
    toolBar.barStyle =  UIBarStyleBlackOpaque;
    NSArray *items=[NSArray arrayWithObjects:
                    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel  target:self action:@selector(cancelPicture)],
                    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace  target:nil action:nil],
                    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera  target:self action:@selector(shootPicture)],
                    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace  target:nil action:nil],
                    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace  target:nil action:nil],
                    nil];
    [toolBar setItems:items];
    
    // create the overlay view
    overlayView = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height-44)];
    
    // important - it needs to be transparent so the camera preview shows through!
    overlayView.opaque=NO;
    overlayView.backgroundColor=[UIColor clearColor];
    
    // parent view for our overlay
    UIView *cameraView=[[UIView alloc] initWithFrame:self.view.bounds];
    [cameraView addSubview:overlayView];
    [cameraView addSubview:toolBar];
    
    imagePickerController = [[UIImagePickerController alloc] init];
    
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO){
        NSLog(@"Camera not available");
        return;
    }
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    imagePickerController.delegate = self;
    
    // hide the camera controls
    imagePickerController.showsCameraControls=NO;
    imagePickerController.wantsFullScreenLayout = YES;
    [imagePickerController setCameraOverlayView:cameraView];
    
    [self presentViewController:imagePickerController animated:YES completion:nil];
    

    Declare this in your header file :

    UIImagePickerController * imagePickerController;
    UIToolbar *toolBar;
    OverlayView *overlayView;
    

    Add this OverlayView.h and .m Class from Apples PhotoPicker.

    Actions for capturing photo using custom camera button:

    -(void) shootPicture {
        [imagePickerController takePicture];
    }
    
    - (IBAction)cancelPicture {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    

    Output will come like this below attached screenshot (I have added a capture button and cancel button in custom overlay view):

    enter image description here

    Happy Coding :)