2012-12-12 34 views
5

Tôi đang sử dụng UIImagePickerController để cho phép người dùng tải ảnh lên để sử dụng trong ứng dụng của tôi. Sau khi chọn ảnh để tải lên, người dùng sau đó được nhắc cắt ảnh của anh ấy/cô ấy (vì tôi đã đặt imagePickerController.allowsEditing = YES). Tuy nhiên, nếu ảnh ở chế độ ngang (nghĩa là ảnh rộng hơn chiều cao), người dùng hiện có thể cắt ảnh theo cách không tạo ra hình ảnh vuông. Điều này là do mức thu phóng mặc định khi cắt ảnh phong cảnh là aspectFit chứ không phải là aspectFill (vì nó dành cho ảnh chân dung).Đặt mức thu phóng tối thiểu cho cắt xén UIImagePickerController

Có thể đặt mức thu phóng tối thiểu cho chế độ chỉnh sửa của UIImagePickerController không? Tôi cho rằng tôi có thể tự động cắt hình ảnh nếu đầu ra không phải là hình vuông, nhưng tôi muốn chỉnh sửa chế độ UIImagePickerController truyền đạt điều này cho người dùng thay vì thực hiện nó cho người đó.

Trả lời

1

Không thể điều chỉnh hành vi của tính năng cắt/chỉnh sửa UIImagePickerController theo cách được hỗ trợ. Bạn có khả năng có thể đào sâu vào hệ thống phân cấp/xem phân cấp UIImagePickerController và cố gắng tìm ra cách thức hoạt động của nó, nhưng đó không phải là một điều rất dễ bảo trì hoặc dễ chịu.

Có nói rằng, UIImagePickerController là một phân lớp của UINavigationController, vì vậy không có gì ngăn bạn triển khai trình điều khiển chế độ xem chỉnh sửa hình ảnh của riêng bạn và đẩy nó vào UIImagePickerController. Điều này có thể sẽ không quá khó, bạn chỉ có thể ném số UIImage được chọn vào một UIScrollView với lớp phủ hình chữ nhật hiển thị vùng cắt, thực hiện một số phép toán và tự cắt bớt số UIImage. Bạn rõ ràng sẽ có toàn quyền kiểm soát các chức năng trong trường hợp này và tôi đặt cược nó sẽ mất ít thời gian để thực hiện hơn spelunking vào ruột của UIImagePickerController.

tôi có lẽ sẽ đặt nó lên bất cứ điều gì quan điểm điều khiển trình bày bảng chọn như thế này:

@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 

Và sau đó xem chỉnh sửa của bạn sẽ có một giao diện như thế này (với một thực hiện cụ thể yêu cầu của bạn):

@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 
Các vấn đề liên quan