UIImagePicker позволяет устанавливать застывшие в центре

У меня есть 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) {
                                 }];
            }
}

Итак, как вы можете видеть, я показываю их точно так же, но редактирование камеры действует иначе, чем редактирование библиотеки фотографий.

Ответ 1

Похоже, это поведение просто ошибка в iOS 6... В основном вы не можете перемещать окно редактирования, оно всегда отскакивает назад до середины, если вы немного увеличите масштаб. Надеюсь, они исправит это в ближайшее время.

Ответ 2

Это поведение по умолчанию для Image Picker Controller, вы не можете его изменить. Единственный другой вариант - создать свою собственную утилиту обрезки. Посмотрите приведенную ниже ссылку:

https://github.com/ardalahmet/SSPhotoCropperViewController

Ответ 3

Я знаю, это нехорошее решение, но оно работает.

Я тестировал 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.

Ответ 4

Обходной путь, который решил это, - добавить запись в info.plist с надписью " Просмотреть статус панели управления на основе контроллера", установленной как NO