2012-12-12 105 views
5

我正在使用UIImagePickerController來允許用戶上傳照片以供我的應用程序使用。選擇要上傳的照片後,系統會提示用戶裁剪他/她的照片(因爲我已設置了imagePickerController.allowsEditing = YES)。然而,如果照片是橫向的(即比其更高),則用戶當前有可能以不輸出正方形圖像的方式裁剪照片。這是因爲裁剪風景照片時的默認縮放級別是aspectFit而不是aspectFill(因爲它是用於人像照片)。設置UIImagePickerController裁剪的最小縮放級別

是否可以爲UIImagePickerController的編輯模式設置最小縮放級別?我想我可以簡單地自動裁剪圖像,如果輸出不是方形的,但我寧願UIImagePickerController的編輯模式傳達給用戶,而不是爲他/她做。

回答

1

無法以受支持的方式調整UIImagePickerController裁剪/編輯功能的行爲。您可能會深入研究控制器/視圖層次結構並試圖弄清楚它是如何工作的,但這不是一個可維護或令人愉快的事情。

話雖如此,UIImagePickerControllerUINavigationController的子類,所以沒有什麼能阻止您實現自己的圖像編輯視圖控制器並將其推到UIImagePickerController上。這可能不會太難,你可以將挑選的UIImage放入UIScrollView,並在矩形覆蓋圖中顯示作物區域,做一些數學運算,然後自己裁剪UIImage。在這種情況下,你顯然可以完全控制功能,我敢打賭,實現這個功能需要的時間比探索UIImagePickerController的膽量更少。

我可能會設置它的任何視圖控制器提出了這樣的選擇器:

@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 

然後你的編輯視圖就會有這樣的接口(與你的需要具體的實施方案):

@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