Uiimagepicker allowsEditing coincé au centre

j'ai un UIImagePicker qui fonctionne parfaitement pour un type de UIImagePickerControllerSourceTypephotolibrary, mais quand J'utilise UIImagePickerControllerSourceTypecamera, la boîte d'édition ne peut pas bouger du centre de l'image. Ainsi, si l'image est plus haute que large, l'utilisateur ne peut pas déplacer la zone d'édition vers le carré supérieur de l'image.

quelqu'un sait pourquoi ce serait le cas? Cela ne se produit que lorsque la source provient de la caméra, pas de la bibliothèque.

Edit: Some Le CODE!!!

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) {
                                 }];
            }
}

comme vous pouvez le voir, je les affiche exactement de la même façon, mais l'édition de caméra agit différemment que l'édition de photothèque.

35
demandé sur Eric 2012-09-28 01:16:43

5 réponses

on dirait que ce comportement est juste un bug dans iOS 6... Fondamentalement, vous ne pouvez pas déplacer la boîte d'édition, il est toujours rebondit au milieu, à moins que vous zoomez un peu. Espérons qu'ils réparent ça bientôt.

48
répondu Eric 2012-10-31 20:41:25

c'est le comportement par défaut du contrôleur Picker, vous ne pouvez pas le modifier. La seule autre option est de créer votre propre utilité de coupe. Consultez le lien ci-dessous pour un exemple:

https://github.com/ardalahmet/SSPhotoCropperViewController

0
répondu Vikings 2012-09-27 22:08:40

je sais, ce n'est pas une bonne solution, mais il fonctionne.

j'ai testé sur iOS8+iPhone5, iOS9+iPhone6sPlus, iOS10+iPhone6, iOS10+iPhone6sPlus.

attention:PLImageScrollView et PLCropOverlayCropView UNDOCUMENTED classes.

- (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: la méthode traverse tous les subviews.

0
répondu iwill 2016-11-01 06:57:39

si vous avez défini "afficher l'apparence de la barre d'état basée sur le contrôleur" À non dans l'info.plist et de l'état de la barre de l'apparence que de la lumière à l'aide de

 UIApplication.shared.statusBarStyle = .lightContent

ou en utilisant n'importe quelle autre méthode , alors mettez simplement le style comme .par défaut avant de présenter le sélecteur d'images. pour exemple:

imagePicker.allowsEditing = true
imagePicker.sourceType = .photoLibrary
UIApplication.shared.statusBarStyle = .default
present(imagePicker, animated: true, completion: nil)

changez le type de source en fonction de votre besoin en photoLibrary ou de l'appareil photo et dans le bloc d'achèvement de votre did finishpickingmediawithinfo ajouter ce qui suit à l'achèvement du bloc.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    //let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage

    var pickedImage : UIImage?
    if let img = info[UIImagePickerControllerEditedImage] as? UIImage
    {
        pickedImage = img

    }
    else if let img = info[UIImagePickerControllerOriginalImage] as? UIImage
    {
        pickedImage = img
    }
    dismiss(animated: true, completion: {
        UIApplication.shared.statusBarStyle         = .lightContent
    })}

Apparemment c'est une solution de contournement pour le même.Espérons que cette aide.

0
répondu ashin asok 2018-08-20 08:13:50

une solution qui l'a résolu est d'ajouter une entrée dans info.plist avec " afficher l'apparence de la barre d'état basée sur le contrôleur" est réglé à NO

-1
répondu Josep Alsina 2017-04-18 14:27:06