5

Ich verwende einen UIImagePickerController, um dem Benutzer das Hochladen eines Fotos für die Verwendung in meiner Anwendung zu ermöglichen. Nachdem ein Foto zum Hochladen ausgewählt wurde, wird der Benutzer aufgefordert, sein Foto zuzuschneiden (seit ich imagePickerController.allowsEditing = YES eingestellt habe). Wenn das Foto jedoch im Querformat vorliegt (d. H. Breiter als es ist größer), ist es dem Benutzer derzeit möglich, das Foto auf eine Weise zu beschneiden, die kein quadratisches Bild ausgibt. Dies liegt daran, dass die Standardzoomstufe beim Zuschneiden von Landschaftsfotos aspectFit ist und nicht aspectFill (wie bei Portraitfotos).Minimale Zoomstufe für UIImagePickerController festlegen cropping

Ist es möglich, die minimale Zoomstufe für den Bearbeitungsmodus von UIImagePickerController festzulegen? Ich nehme an, ich könnte einfach das Bild automatisch beschneiden, wenn die Ausgabe nicht quadratisch ist, aber ich würde lieber, dass der Bearbeitungsmodus von UIImagePickerController dies dem Benutzer übermittelt, anstatt es für ihn zu tun.

Antwort

1

Es ist nicht möglich, das Verhalten der Funktion UIImagePickerController Zuschneiden/Bearbeiten auf eine unterstützte Weise anzupassen. Sie könnten möglicherweise in die UIImagePickerController Controller/View-Hierarchie graben und versuchen, herauszufinden, wie es funktioniert, aber das ist nicht eine sehr wartungsfreundliche oder angenehme Sache zu tun.

Having said, dass die UIImagePickerController eine Unterklasse von UINavigationController ist, so gibt es nichts hindert Sie daran aus dem eigenen Bildbearbeitungs View-Controller-Implementierung und auf den UIImagePickerController schieben. Dies wäre wahrscheinlich nicht zu schwer, Sie könnten einfach die gepflückt UIImage in eine UIScrollView mit einem rechteckigen Overlay werfen, die den Ausschnitt zeigen, etwas Mathe, und schneiden Sie die UIImage selbst. Sie würden natürlich die volle Kontrolle über die Funktionalität in diesem Fall haben und ich wette, es würde weniger Zeit in Anspruch nehmen, als das Eintauchen in den Mut von UIImagePickerController.

würde ich stelle es wahrscheinlich auf, was View-Controller die Picker wie folgt dargestellt:

@interface MainViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, ImageEditorViewControllerDelegate> 
@end 

@implementation MainViewController { 
    UIImagePickerController* _imagePickerController; 
} 
#pragma mark IBAction 
- (IBAction)pickImage:(id)sender { 
    _imagePickerController = [[UIImagePickerController alloc] init]; 
    _imagePickerController.delegate = self; 
    _imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    _imagePickerController.allowsEditing = NO; 

    [self presentViewController:_imagePickerController animated:YES completion:nil]; 
} 


#pragma mark UIImagePickerControllerDelegate 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    ImageEditorViewController* imageEditorViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ImageEditor"]; 
    imageEditorViewController.delegate = self; 
    imageEditorViewController.imageToEdit = info[UIImagePickerControllerOriginalImage]; 

    [_imagePickerController pushViewController:imageEditorViewController animated:YES]; 
} 


- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 
    [self dismissViewControllerAnimated:YES completion:^{ 
     _imagePickerController = nil; 
    }]; 
} 


#pragma mark ImageEditorViewControllerDelegate 
- (void)imageEditorViewController:(ImageEditorViewController *)imageEditorViewController didFinishWithInfo:(NSDictionary *)info { 
    // TODO: Handle the edited media 

    [self dismissViewControllerAnimated:YES completion:^{ 
     _imagePickerController = nil; 
    }]; 
} 
@end 

Und dann würde Ihre Bearbeitungsansicht eine Schnittstelle wie diese hat (mit einer Implementierung speziell für Ihre Bedürfnisse):

@protocol ImageEditorViewControllerDelegate; 

@interface ImageEditorViewController : UIViewController 
@property(nonatomic, strong) UIImage* imageToEdit; 

@property(nonatomic, weak) id <ImageEditorViewControllerDelegate> delegate; 
@end 

@protocol ImageEditorViewControllerDelegate 
- (void)imageEditorViewController:(ImageEditorViewController*)imageEditorViewController didFinishWithInfo:(NSDictionary*)info; 
@end