2014-06-10 14 views
10

Dopo aver letto la documentazione e sample code from apple per UIImagePickerController e dopo aver letto molti tutorial e anche Questions qui su Stackoverflow (or here), sono giunto alla conclusione che UIImagePicker è in grado di presentare una "finestra di ritaglio" all'utente e consente all'utente di ritagliare e spostare la parte destra dell'immagine che desidera utilizzare.UIImagePickerController + Ritaglio: cosa permette AllowEditing e cosa non lo fa?

Ma esaminando questi esempi su iOS 7.1, non appare alcuna finestra di ritaglio. Non appare nulla che consenta all'utente di ritagliare una parte dell'immagine presa. Tutti i test si sono verificati su hardware reale (iPhone 5S), nessun simulatore iPhone è stato utilizzato qui a causa della telecamera mancante;)

Inoltre, al metodo delegato "didFinishPickingMediaWithInfo" non è presente alcuna voce di "UIImagePickerControllerEditedImage" nelle "informazioni" - NSDictionary.

quello che ho fatto:

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; 

#if TARGET_IPHONE_SIMULATOR 
    // iPhone-Simulator has no camera, just save images to the photoalbum on the simulator to use them here 
    imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
#else 
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 
#endif 

    imagePickerController.editing = YES; 
    imagePickerController.delegate = (id)self; 
    imagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto; 


    [self presentModalViewController:imagePickerController animated:YES]; 

ed il metodo delegato:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
     // .... do something 
} 

A questo punto, solo 3 chiavi sono disponibili nel Dizionario con il nome di "info":

  • UIImagePickerControllerOriginalImage
  • UIImagePickerControll erMediaMetadata
  • UIImagePickerControllerMediaType

nient'altro. Inoltre, non è stata visualizzata alcuna finestra di ritaglio o controlli simili.

Sono in errore con le mie aspettative sul comportamento di ImagePicker? A questa domanda SF l'utente ha scritto "Crop window comes up". La funzione è stata rimossa? La documentazione è obsoleta o ho completamente torto qui?

Ho provato anche questo codice preso da un altro answer to a similar question:

- (void) imagePickerController:(UIImagePickerController *)picker 
    didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    [picker dismissViewControllerAnimated:YES completion:^{ 
      // Edited image works great (if you allowed editing) 
     UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage]; 
      // AND the original image works great 
     UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage]; 
      // AND do whatever you want with it, (NSDictionary *)info is fine now 
     UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage]; 
    }]; 
} 

non appare alcuna finestra di ritaglio, il tasto "UIImagePickerControllerEditedImage" non è presente alla info-NSDictionary.

Qualcuno può spiegarmi il comportamento giusto? Grazie mille in anticipo.

risposta

3

questo è per me funziona:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    UIImage *originalImage, *editedImage; 

    editedImage = (UIImage *) [info objectForKey:UIImagePickerControllerEditedImage]; 
    originalImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage]; 

    if (editedImage) 
     self.profilePictureImageView.image = editedImage; 
    else 
     self.profilePictureImageView.image = originalImage; 

    [picker dismissViewControllerAnimated:YES completion:nil]; 
} 
+0

Ha lo stesso effetto già descritto nella domanda: non appare alcuna finestra di ritaglio. tutto quello che posso fare è scattare la foto o riprenderla. – itinance

0

In primo luogo assicurarsi di importare i seguenti file di intestazione (è necessario importare il quadro MobileCoreServices al progetto):

#import <MobileCoreServices/UTCoreTypes.h> 

quindi provare il seguente codice

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 

#if TARGET_IPHONE_SIMULATOR 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]){ 
     imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    } 
#else 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){ 
     imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; 
    } 
#endif 

    imagePicker.mediaTypes = @[(NSString *)kUTTypeImage]; 
    imagePicker.allowsEditing = YES; 
    imagePicker.delegate = self; 

    //[self presentModalViewController:imagePicker animated:YES]; <-- This method is deprecated use the following instead 

    [self presentViewController:imagePicker animated:YES completion:nil];