Cosa usare al posto di un metodo UIImagePickerControllerDelegate obsoleto?
-
22-07-2019 - |
Domanda
Ho seguito un ottimo tutorial ( http: // iphone. zcentric.com/2008/08/28/using-a-uiimagepickercontroller/ ) sull'uso di UIImagePickerController per ottenere immagini dall'album fotografico o dalla fotocamera dell'iPhone. Il problema è che il tutorial è un po 'datato e la documentazione cita un metodo utilizzato dal delegato come ammortizzato dal 3.0. Il problema è che la documentazione non è riuscita a fornire indizi su cosa usare sul posto? Il metodo obsoleto è:
– imagePickerController:didFinishPickingImage:editingInfo:
Il metodo sopra è usato come segue:
- (void) imagePickerController:(UIImagePickerController*)picker didFinishPickingImage:(UIImage*)img editingInfo:(NSDictionary*)editInfo
{
image.image = img;
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
}
DOMANDA: Cosa viene attualmente utilizzato al posto del metodo obsoleto?
Soluzione
Citando la documentazione Apple:
imagePickerController:didFinishPickingImage:editingInfo:
Indica al delegato che l'utente ha scelto un'immagine. Questo metodo è facoltativo ( Obsoleto in iPhone OS 3.0. Usa
imagePickerController: didFinishPickingMediaWithInfo:
invece .)
Altri suggerimenti
Ecco come utilizzare la nuova API di selezione delle immagini in breve.
Innanzitutto, è necessario dichiarare una classe come questa poiché si sta impostando come delegato del selettore di immagini:
@interface MyClass : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> {
UIImagePickerController* imagePicker;
}
@property(nonatomic,retain) UIImagePickerController* imagePicker;
- (IBAction) takePicture:(id)sender;
@end
Il metodo che porta in primo piano il selettore di immagini sarebbe simile a questo. È dichiarato qui come IBAction
in modo da poterlo collegare direttamente a un controllo (come un pulsante) in Interface Builder. Controlla anche che se sei su un iPhone visualizzi l'interfaccia della fotocamera ma su un iPod Touch visualizzi il selettore galleria:
#import <MobileCoreServices/UTCoreTypes.h>
...
@synthesize imagePicker = _imagePicker;
...
- (void) takePicture:(id)sender
{
if (!_imagePicker) {
self.imagePicker = [[UIImagePickerController alloc] init];
self.imagePicker.delegate = self;
}
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
NSArray* mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
self.imagePicker.mediaTypes = mediaTypes;
} else {
self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
self.imagePicker.allowsImageEditing = YES;
}
[self presentModalViewController:self.imagePicker animated:YES];
}
Quindi hai bisogno di questi due metodi:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
// MediaType can be kUTTypeImage or kUTTypeMovie. If it's a movie then you
// can get the URL to the actual file itself. This example only looks for images.
//
NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
// NSString* videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];
// Try getting the edited image first. If it doesn't exist then you get the
// original image.
//
if (CFStringCompare((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo) {
UIImage* picture = [info objectForKey:UIImagePickerControllerEditedImage];
if (!picture)
picture = [info objectForKey:UIImagePickerControllerOriginalImage];
// **You can now do something with the picture.
}
self.imagePicker = nil;
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
self.imagePicker = nil;
}