简体   繁体   中英

how to add image from photo library or camera to my Ipad application?

I want to add images from photo library or by using camera to my ipad application. I had used same coding as iphone . But the application is crashing. I think this is not the right way to add picture from library to ipad application. If anyone knows please help me.

-(void)ctnPhotoSelection
{
    isMyCtView = YES;
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@""
                                                             delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil
                                                    otherButtonTitles:@"Take Photo With Camera", @"Select Photo From Library", @"Cancel", nil];
    actionSheet.actionSheetStyle = UIActionSheetStyleAutomatic;
    actionSheet.destructiveButtonIndex = 1; 
    [actionSheet showInView:self.view]; 
    [actionSheet release];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0)
    {
        [self TakePhotoWithCamera];
    }   
    else if (buttonIndex == 1)
    {
        [self SelectPhotoFromLibrary];
    }

    else if (buttonIndex == 2)
    {
        NSLog(@"cancel");
    }
}

-(void) TakePhotoWithCamera
{
    [self startCameraPickerFromViewController:self usingDelegate:self];
}

-(void) SelectPhotoFromLibrary
{
    [self startLibraryPickerFromViewController:self usingDelegate:self];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker  
{  
    [[picker parentViewController] dismissModalViewControllerAnimated:YES];
}  

- (BOOL)startCameraPickerFromViewController:(UIViewController*)controller usingDelegate:(id<UIImagePickerControllerDelegate>)delegateObject  
{
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;
        picker.allowsEditing = YES;
        picker.delegate = self;
        [controller presentModalViewController:picker animated:YES];
        [picker release];
    }
    return YES;  
}  

- (BOOL)startLibraryPickerFromViewController:(UIViewController*)controller usingDelegate:(id<UIImagePickerControllerDelegate>)delegateObject  
{
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) 
    {
        UIImagePickerController *picker1 = [[UIImagePickerController alloc]init];
        picker1.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        picker1.allowsEditing = YES;
        picker1.delegate = self;
        [controller presentModalViewController:picker1 animated:YES];
        [picker1 release];
    }
    return YES;  
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{   
    UIImage * img = [info objectForKey:@"UIImagePickerControllerEditedImage"];
    [self useImage:img];
    [[picker parentViewController] dismissModalViewControllerAnimated:NO];
    UINavigationController* navController = self.navigationController;
    UIViewController* controller = [navController.viewControllers objectAtIndex:0];
    [controller dismissModalViewControllerAnimated:NO];
}

-(void)useImage:(UIImage *)theImage
{
    NSData *addImageData = UIImagePNGRepresentation(theImage);
    IpadAppDelegate *appDelegate=(IpadAppDelegate*)[ [UIApplication sharedApplication] delegate];

    if(isMyCtView == YES)
    {
        isMyCtView = NO;
        appDelegate.imageCtData = addImageData;
        appDelegate.isctFromDevice = YES;
        appDelegate.isctnCntrl = YES;
        [self.view sendSubviewToBack:myCtnView];
    }

    [self reloadView];
}

Crash Log

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be presented via UIPopoverController'
*** Call stack at first throw:
(
 0   CoreFoundation                      0x3587a987 __exceptionPreprocess + 114
 1   libobjc.A.dylib                     0x34a8249d objc_exception_throw + 24
 2   UIKit                               0x34378317 UIImagePickerEnsureViewIsInsidePopover + 258
 3   PhotoLibrary                        0x3499893b -[PLLibraryView didMoveToWindow] + 86
 4   UIKit                               0x341bf76b -[UIView(Internal) _didMoveFromWindow:toWindow:] + 698
 5   UIKit                               0x341bf583 -[UIView(Internal) _didMoveFromWindow:toWindow:] + 210
 6   UIKit                               0x341bf433 -[UIView(Hierarchy) _postMovedFromSuperview:] + 106
 7   UIKit                               0x341aa82f -[UIView(Internal) _addSubview:positioned:relativeTo:] + 678
 8   UIKit                               0x341aa57f -[UIView(Hierarchy) addSubview:] + 22
 9   UIKit                               0x341fc8a9 -[UINavigationTransitionView transition:fromView:toView:] + 416
 10  UIKit                               0x341fc6fd -[UINavigationTransitionView transition:toView:] + 20
 11  UIKit                               0x341ef8cf -[UINavigationController _startTransition:fromViewController:toViewController:] + 1274
 12  UIKit                               0x341ef35f -[UINavigationController _startDeferredTransitionIfNeeded] + 182
 13  UIKit                               0x341ef2a3 -[UINavigationController viewWillLayoutSubviews] + 14
 14  UIKit                               0x341ef23f -[UILayoutContainerView layoutSubviews] + 138
 15  UIKit                               0x341b80cf -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 26
 16  CoreFoundation                      0x35818bbf -[NSObject(NSObject) performSelector:withObject:] + 22
 17  QuartzCore                          0x31075685 -[CALayer layoutSublayers] + 120
 18  QuartzCore                          0x3107543d CALayerLayoutIfNeeded + 184
 19  QuartzCore                          0x3106f56d _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 212
 20  QuartzCore                          0x3106f383 _ZN2CA11Transaction6commitEv + 190
 21  QuartzCore                          0x31092f9d _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 52
 22  CoreFoundation                      0x3580ac59 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 16
 23  CoreFoundation                      0x3580aacd __CFRunLoopDoObservers + 412
 24  CoreFoundation                      0x358020cb __CFRunLoopRun + 854
 25  CoreFoundation                      0x35801c87 CFRunLoopRunSpecific + 230
 26  CoreFoundation                      0x35801b8f CFRunLoopRunInMode + 58
 27  GraphicsServices                    0x320c84ab GSEventRunModal + 114
 28  GraphicsServices                    0x320c8557 GSEventRun + 62
 29  UIKit                               0x341dc329 -[UIApplication _run] + 412
 30  UIKit                               0x341d9e93 UIApplicationMain + 670
 31  IpadComicBuilder                    0x00002537 main + 70
 32  IpadComicBuilder                    0x000024b8 start + 52
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).
(gdb)

The answer is in your error message.

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be presented via UIPopoverController'

On an iPad, you can't just use the iPhone method of selecting an image. You need to use a UIPopoverController , you can pass it your UIImagePickerController with:

UIPopoverController* popover = [[UIPopoverController alloc] initWithContentViewController: imagePicker];

Then implement the UIPopoverControllerDelegate protocol in your class.

You can find an example of this here .

- (void)buttonTap {

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: nil
                                                         delegate: self
                                                cancelButtonTitle: @"Cancel"
                                           destructiveButtonTitle: nil
                                                otherButtonTitles: @"Take a new photo",
                                                         @"Choose from existing", nil];
                                                   [actionSheet showInView:self.view];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

    int i = buttonIndex;

        switch(i) {

    case 0:
    {

      //Code for camera  

    }
        break;
    case 1:
    {
        UIImagePickerController * picker = [[UIImagePickerController alloc] init];
        picker.delegate = self;
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
       self.popover = [[UIPopoverController alloc] initWithContentViewController: picker];
        self.popover.delegate =self;
        [self.popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }

    default:
        // Do Nothing.........
        break;

    }
}

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

    NSLog(@"Picker returned successfully.");

    UIImage *selectedImage;

    NSURL *mediaUrl;

    mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL];

    if (mediaUrl == nil) {

    selectedImage = (UIImage *) [info valueForKey:UIImagePickerControllerEditedImage];
    if (selectedImage == nil) {

        selectedImage= (UIImage *) [info valueForKey:UIImagePickerControllerOriginalImage];
        NSLog(@"Original image picked.");

         }
    else {

        NSLog(@"Edited image picked.");

         }    

    }

    [picker dismissModalViewControllerAnimated:YES];


    [self.imageButton setImage:selectedImage forState:UIControlStateNormal];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    [self dismissModalViewControllerAnimated:YES];
}

for Swift 4

get image from camera

let picker = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = true
picker.sourceType = .camera
self.present(picker, animated: true, completion: nil)

get image from library

let picker = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = true
picker.sourceType = .photoLibrary
self.present(picker, animated: true, completion: nil)

delegate function

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
  var result = false

  if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
      //do something to image here ...

      picker.dismiss(animated: true, completion: nil)
  }
}

In your view controller, don't forget to inherit class UIImagePickerControllerDelegate , UINavigationControllerDelegate

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM