Overlay controller in ASP.NET

Overlay controller used to provide custom Overlay on your screen when you want to provide custom options in Camera Interface.

#import "OverlayViewController.h"

 

enum

{

    kOneShot,       // user wants to take a delayed single shot

    kRepeatingShot  // user wants to take repeating shots

};

 

@implementation OverlayViewController

 

@synthesize delegate, takePictureButton, startStopButton,

            cancelButton, timedButton,

            tickTimer, cameraTimer,

            imagePickerController; 

 

#pragma mark -

#pragma mark OverlayViewController

 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]))

    {

        AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:

                                                    [[NSBundle mainBundle] pathForResource:@"tick"

                                                                                    ofType:@"aiff"]],

                                         &tickSound);

 

        self.imagePickerController = [[[UIImagePickerController alloc] init] autorelease];

        self.imagePickerController.delegate = self;

    }

    return self;

}

 

- (void)viewDidUnload

{

    self.takePictureButton = nil;

    self.startStopButton = nil;

    self.timedButton = nil;

    self.cancelButton = nil;

   

    self.cameraTimer = nil;

   

    [super viewDidUnload];

}

 

- (void)dealloc

{  

    [takePictureButton release];

    [startStopButton release];

    [cancelButton release];

    [timedButton release];

   

    [imagePickerController release];

    AudioServicesDisposeSystemSoundID(tickSound);

 

    [cameraTimer release];

    [tickTimer release];

   

    [super dealloc];

}

 

- (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType

{

    self.imagePickerController.sourceType = sourceType;

   

    if (sourceType == UIImagePickerControllerSourceTypeCamera)

    {

        // user wants to use the camera interface

        //

        self.imagePickerController.showsCameraControls = NO;

        

        if ([[self.imagePickerController.cameraOverlayView subviews] count] == 0)

        {

            // setup our custom overlay view for the camera

            //

            // ensure that our custom view's frame fits within the parent frame

            CGRect overlayViewFrame = self.imagePickerController.cameraOverlayView.frame;

            CGRect newFrame = CGRectMake(0.0,

                                         CGRectGetHeight(overlayViewFrame) -

                                         self.view.frame.size.height - 10.0,

                                         CGRectGetWidth(overlayViewFrame),

                                         self.view.frame.size.height + 10.0);

            self.view.frame = newFrame;

            [self.imagePickerController.cameraOverlayView addSubview:self.view];

        }

    }

}

 

// called when the parent application receives a memory warning

- (void)didReceiveMemoryWarning

{

    // we have been warned that memory is getting low, stop all timers

    //

    [super didReceiveMemoryWarning];

   

    // stop all timers

    [self.cameraTimer invalidate];

    cameraTimer = nil;

   

    [self.tickTimer invalidate];

    tickTimer = nil;

}

 

// update the UI after an image has been chosen or picture taken

//

- (void)finishAndUpdate

{

    [self.delegate didFinishWithCamera];  // tell our delegate we are done with the camera

 

    // restore the state of our overlay toolbar buttons

    self.cancelButton.enabled = YES;

    self.takePictureButton.enabled = YES;

    self.timedButton.enabled = YES;

    self.startStopButton.enabled = YES;

    self.startStopButton.title = @"Start";

 

#pragma mark -

#pragma mark Camera Actions

 

- (IBAction)done:(id)sender

{

    // dismiss the camera

    //

    // but not if it's still taking timed pictures

    if (![self.cameraTimer isValid])

        [self finishAndUpdate];

}

 

// this will take a timed photo, to be taken 5 seconds from now

//

- (IBAction)timedTakePhoto:(id)sender

{

    // these controls can't be used until the photo has been taken

    self.cancelButton.enabled = NO;

    self.takePictureButton.enabled = NO;

    self.timedButton.enabled = NO;

    self.startStopButton.enabled = NO;

 

    if (cameraTimer != nil)

        [cameraTimer invalidate];

    cameraTimer = [NSTimer scheduledTimerWithTimeInterval:5.0

                                                   target:self

                                                 selector:@selector(timedPhotoFire:)

                                                 userInfo:[NSNumber numberWithInt:kOneShot]

                                                  repeats:YES];

 

    // start the timer to sound off a tick every 1 second (sound effect before a timed picture is taken)

    if (tickTimer != nil)

        [tickTimer invalidate];

    tickTimer = [NSTimer scheduledTimerWithTimeInterval:1.0

                                                   target:self

                                                 selector:@selector(tickFire:)

                                                 userInfo:nil

                                                  repeats:YES];

}

 

- (IBAction)takePhoto:(id)sender

{

    [self.imagePickerController takePicture];

}

 

- (IBAction)startStop:(id)sender

{

    if ([self.cameraTimer isValid])

    {

        // stop and reset the timer

        [self.cameraTimer invalidate];

        cameraTimer = nil;

 

        [self finishAndUpdate];

    }

    else

    {

        // start the timer to take a photo every 1.5 seconds

        //

        // CAUTION: for the purpose of this sample, we will continue to take pictures indefinitely.

        // Be aware we will run out of memory quickly.  You must decide the proper threshold

        // number of photos allowed to take from the camera.

        //

        // One solution to avoid memory constraints is to save each taken photo to disk rather

        // than keeping all of them in memory.

        //

        // In low memory situations sometimes our "didReceiveMemoryWarning" method will be called

        // in which case we can recover some memory and keep the app running.

        //

        self.startStopButton.title = @"Stop";

        self.cancelButton.enabled = NO;

        self.timedButton.enabled = NO;

        self.takePictureButton.enabled = NO;

 

        cameraTimer = [NSTimer scheduledTimerWithTimeInterval:1.5   // fire every 1.5 seconds

                                                       target:self

                                                     selector:@selector(timedPhotoFire:)

                                                     userInfo:[NSNumber numberWithInt:kRepeatingShot]

                                                      repeats:YES];

        [cameraTimer fire]; // start taking pictures right away

    }

 

#pragma mark -

#pragma mark Timer

 

// gets called by our repettive timer to take a picture

- (void)timedPhotoFire:(NSTimer *)timer

{

    [self.imagePickerController takePicture];

   

    NSInteger cameraAction = [self.cameraTimer.userInfo integerValue];

    switch (cameraAction)

    {

        case kOneShot:

        {

            // timer fired for a delayed single shot

            [self.cameraTimer invalidate];

            cameraTimer = nil;

           

            [self.tickTimer invalidate];

            tickTimer = nil;

           

            break;

        }

           

        case kRepeatingShot:

        {

            // timer fired for a repeating shot

            break;

        }

    }

}

 

// gets called by our delayed camera shot timer to play a tick noise

- (void)tickFire:(NSTimer *)timer

{

    AudioServicesPlaySystemSound(tickSound);

 

#pragma mark -

#pragma mark UIImagePickerControllerDelegate

 

// this get called when an image has been chosen from the library or taken from the camera

//

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

{

    UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];

   

    // give the taken picture to our delegate

    if (self.delegate)

        [self.delegate didTakePicture:image];

   

    if (![self.cameraTimer isValid])

        [self finishAndUpdate];

}

 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker

{

    [self.delegate didFinishWithCamera];    // tell our delegate we are finished with the picker

} 

@end