I have an application where I want to allow a user to get a picture from either the camera or the photo library. I'm using the following code.
It works fine in launching the camera or photo library. And clicking on "cancel" sends me back to my app.
But the UIImagePickerController is so slow, it is unusable. I haven't been able to successfully pick a picture yet. It's not crashing, it just hangs forever. I've tested this on both the simulator and the device and have a similar experience.
I'm not sure what is wrong or what to try next. Suggestions?
@interface ChoosePhotoLayer: Layer <UIImagePickerControllerDelegate,UINavigationControllerDelegate>
{
UIImagePickerController *picker;
}
- (void)openCamera;
- (void)openPhotoLibrary;
@end
@implementation ChoosePhotoLayer
-(id) init {
if( ! [super init] )
return nil;
float x,y;
CGSize size = [[Director sharedDirector] winSize];
x = size.width;
y = size.height;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
NSLog(@"device has camera");
} else {
NSLog(@"device does not have camera, do not show camera menu item...");
}
// Create Menu
MenuItem *cameraMenuItem = [MenuItemImage itemFromNormalImage:@"camera.png" selectedImage:@"camera.png"
target:self selector:@selector(menuCallbackCamera:)];
MenuItem *libraryMenuItem = [MenuItemImage itemFromNormalImage:@"lib.png" selectedImage:@"lib.png"
target:self selector:@selector(menuCallbackLibrary:)];
Menu *menu = [Menu menuWithItems: cameraMenuItem, libraryMenuItem, nil];
[menu alignItemsVertically];
// Position menu at bottom of screen
CGPoint p = menu.position;
menu.position = ccpSub(p, ccp(0,VERTICAL_MENU_OFFSET));
// Add Menu to Screen
[self addChild: menu z:5];
return self;
}
-(void) menuCallbackCamera: (id) sender {
NSLog(@"ChoosePhotoLayer: open camera");
[self openCamera];
}
-(void) menuCallbackLibrary: (id) sender {
NSLog(@"ChoosePhotoLayer: open library");
[self openPhotoLibrary];
}
- (void)openCamera {
NSLog(@"openCamera");
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
if (picker != nil) {
NSLog(@"releasing picker...");
[picker release];
}
picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsImageEditing = YES;
picker.delegate = self;
[[[Director sharedDirector] openGLView] addSubview:picker.view];
}
}
- (void) openPhotoLibrary {
NSLog(@"openPhotolibrary");
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
if (picker != nil) {
NSLog(@"releasing picker...");
[picker release];
}
picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.allowsImageEditing = YES;
picker.delegate = self;
[[[Director sharedDirector] openGLView] addSubview:picker.view];
}
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)currentPicker {
NSLog(@"imagePickerControllerDidCancel");
// hide the picker if user cancels picking an image.
[currentPicker dismissModalViewControllerAnimated:YES];
picker.view.hidden = YES;
[picker.view removeFromSuperview];
}
- (void)imagePickerController:(UIImagePickerController *)currentPicker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
// do something...
}
- (void) dealloc {
[picker release];
[super dealloc];
}
@end