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 Phot开发者_Python百科oLibrary 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
精彩评论