5

Używam UIImagePickerController, aby umożliwić użytkownikowi przesłanie zdjęcia do użycia w mojej aplikacji. Po wybraniu zdjęcia do przesłania użytkownik jest monitowany o przycięcie jego zdjęcia (ponieważ ustawiłem imagePickerController.allowsEditing = YES). Jeśli jednak zdjęcie jest krajobrazowe (tj. Jest szersze niż wyższe), użytkownik może obecnie przyciąć zdjęcie w sposób, który nie wyświetla kwadratowego obrazu. Wynika to z faktu, że domyślny poziom powiększenia podczas kadrowania zdjęć krajobrazu to aspectFit, a nie aspectFill (tak jak w przypadku zdjęć portretowych).Ustawianie minimalnego poziomu powiększenia dla przycinania UIImagePickerController

Czy można ustawić minimalny poziom zoomu dla trybu edycji UIImagePickerler? Przypuszczam, że mógłbym po prostu automatycznie przyciąć obraz, jeśli wynik nie jest kwadratowy, ale wolałbym, aby tryb edycji UIImagePickerController przekazał go użytkownikowi, zamiast robić to za niego/nią.

Odpowiedz

1

Nie można zmienić zachowania przycinania/edycji UIImagePickerController w obsługiwany sposób. Możesz potencjalnie zagłębić się w kontroler/hierarchię widoku UIImagePickerController i spróbować dowiedzieć się, jak to działa, ale nie jest to zbyt łatwe do utrzymania lub przyjemne.

Po tym, UIImagePickerController jest podklasą UINavigationController, więc nic nie powstrzyma cię przed zaimplementowaniem własnego kontrolera widoku edycji obrazu i wciśnięciem go na UIImagePickerController. Prawdopodobnie nie byłoby to zbyt trudne, wystarczy rzucić wybrane UIImage do postaci UIScrollView z prostokątną nakładką, pokazującą obszar przycinania, wykonać kilka zadań matematycznych i przyciąć samemu UIImage. Oczywiście miałbyś pełną kontrolę nad funkcjonalnością w tym przypadku i założę się, że zajmie to mniej czasu niż spelunkowanie do wnętrzności UIImagePickerController.

to pewnie go ustawić niezależnie widok kontroler przedstawił kompletacji takiego:

@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 

I wówczas widok edycja miałaby interfejs następująco (z implementacji konkretnego do swoich potrzeb):

@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 
Powiązane problemy