Ответ 1
Похоже, это поведение просто ошибка в iOS 6... В основном вы не можете перемещать окно редактирования, оно всегда отскакивает назад до середины, если вы немного увеличите масштаб. Надеюсь, они исправит это в ближайшее время.
У меня есть UIImagePicker, который отлично подходит для типа UIImagePickerControllerSourceTypePhotoLibrary, но когда я использую UIImagePickerControllerSourceTypeCamera, окно редактирования не может перемещаться из центра изображения. Поэтому, если изображение более высокое, чем широкое, пользователь не может переместить блок редактирования на верхний квадрат изображения.
Кто-нибудь знает, почему это так? Это происходит только тогда, когда источник находится из камеры, а не из библиотеки.
Изменить: Некоторые КОДЫ!!!
if (actionSheet.tag == 2) {
if (buttonIndex == 0) { // Camera
// Check for camera
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == YES) {
// Create image picker controller
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
// Set source to the camera
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.allowsEditing = YES;
// Delegate is self
imagePicker.delegate = self;
// Show image picker
[self presentViewController:imagePicker
animated:YES
completion:^(void) {
}];
}
}
else if (buttonIndex == 1) { // Photo Library
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary] == YES) {
// Create image picker controller
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
// Set source to the camera
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.allowsEditing = YES;
// Delegate is self
imagePicker.delegate = self;
// Show image picker
[self presentViewController:imagePicker
animated:YES
completion:^(void) {
}];
}
}
Итак, как вы можете видеть, я показываю их точно так же, но редактирование камеры действует иначе, чем редактирование библиотеки фотографий.
Похоже, это поведение просто ошибка в iOS 6... В основном вы не можете перемещать окно редактирования, оно всегда отскакивает назад до середины, если вы немного увеличите масштаб. Надеюсь, они исправит это в ближайшее время.
Это поведение по умолчанию для Image Picker Controller, вы не можете его изменить. Единственный другой вариант - создать свою собственную утилиту обрезки. Посмотрите приведенную ниже ссылку:
Я знаю, это нехорошее решение, но оно работает.
Я тестировал iOS8 + iPhone5, iOS9 + iPhone6sPlus, iOS10 + iPhone6, iOS10 + iPhone6sPlus.
ПРЕДОСТЕРЕЖЕНИЕ: PLImageScrollView
и PLCropOverlayCropView
являются классами UNDOCUMENTED.
- (void)showImagePickerControllerWithSourceType:(UIImagePickerControllerSourceType)sourceType {
UIImagePickerController *imagePickerController = [UIImagePickerController new];
imagePickerController.sourceType = sourceType;
imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage];
imagePickerController.allowsEditing = YES;
imagePickerController.delegate = self;
[self presentViewController:imagePickerController animated:YES completion:^{
[self fxxxImagePickerController:imagePickerController];
}];
}
- (void)fxxxImagePickerController:(UIImagePickerController *)imagePickerController {
if (!imagePickerController
|| !imagePickerController.allowsEditing
|| imagePickerController.sourceType != UIImagePickerControllerSourceTypeCamera) {
return;
}
// !!!: UNDOCUMENTED CLASS
Class ScrollViewClass = NSClassFromString(@"PLImageScrollView");
Class CropViewClass = NSClassFromString(@"PLCropOverlayCropView");
[imagePickerController.view eachSubview:^BOOL(UIView *subview, NSInteger depth) {
if ([subview isKindOfClass:CropViewClass]) {
// 0. crop rect position
subview.frame = subview.superview.bounds;
}
else if ([subview isKindOfClass:[UIScrollView class]]
&& [subview isKindOfClass:ScrollViewClass]) {
BOOL isNewImageScrollView = !self->_imageScrollView;
self->_imageScrollView = (UIScrollView *)subview;
// 1. enable scrolling
CGSize size = self->_imageScrollView.frame.size;
CGFloat inset = ABS(size.width - size.height) / 2;
self->_imageScrollView.contentInset = UIEdgeInsetsMake(inset, 0, inset, 0);
// 2. centering image by default
if (isNewImageScrollView) {
CGSize contentSize = self->_imageScrollView.contentSize;
if (contentSize.height > contentSize.width) {
CGFloat offset = round((contentSize.height - contentSize.width) / 2 - inset);
self->_imageScrollView.contentOffset = CGPointMake(self->_imageScrollView.contentOffset.x, offset);
}
}
}
return YES;
}];
// prevent re-layout, maybe not necessary
@weakify(self, imagePickerController);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
@strongify(self, imagePickerController);
[self fxxxImagePickerController:imagePickerController];
});
}
EDIT: метод eachSubview:
перемещает все дерево subviews.
Обходной путь, который решил это, - добавить запись в info.plist с надписью " Просмотреть статус панели управления на основе контроллера", установленной как NO