【问题标题】:how to add image from photo library or camera to my Ipad application?如何将照片库或相机中的图像添加到我的 Ipad 应用程序?
【发布时间】:2011-06-16 14:39:16
【问题描述】:

我想将照片库中的图像或使用相机添加到我的 ipad 应用程序中。我使用了与 iphone 相同的编码。但是应用程序正在崩溃。我认为这不是将图片从库添加到 ipad 应用程序的正确方法。如果有人知道,请帮助我。

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

崩溃日志

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)

【问题讨论】:

  • 向我们展示导致应用程序崩溃的代码将有助于诊断您的问题。您表示您认为添加图片的方式不正确,但我们不知道您使用的是什么方式。
  • 当应用程序崩溃时控制台和堆栈跟踪会说什么?

标签: objective-c ios ipad


【解决方案1】:

答案在您的错误信息中。

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

在 iPad 上,您不能只使用 iPhone 选择图像的方法。您需要使用UIPopoverController,您可以将 UIImagePickerController 传递给它:

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

然后在你的类中实现UIPopoverControllerDelegate 协议。

你可以找到这个here的例子。

【讨论】:

    【解决方案2】:
    - (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];
    }
    

    【讨论】:

      【解决方案3】:

      适用于 Swift 4

      从相机获取图像

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

      从库中获取图片

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

      委托功能

      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)
        }
      }
      

      在你的视图控制器中,不要忘记继承类UIImagePickerControllerDelegate,UINavigationControllerDelegate

      【讨论】:

        猜你喜欢
        • 2012-02-04
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多