允许编辑时,UIImagePickerController显示错误的裁剪

时间:2015-01-29 15:47:22

标签: ios objective-c uiimage uiimagepickercontroller

我遇到UIImagePickerController的问题,我已经启用了编辑,但是当用户裁剪图像时,正方形裁剪显示用户将是裁剪之间存在偏差,以及实际作物是什么。它只能在大约20像素的情况下工作,但现在是个大问题。我已经包含两个演示此问题的屏幕截图。在第一个中,裁剪方块似乎延伸到图像上方,但是当选择inage时,图像的顶部被正确设置(图像只是一个屏幕截图,因此图像的顶部是状态栏的顶部)。在第二个屏幕截图中,如果您尝试将裁剪放到照片的最底部,它会弹回到此位置,因此用户认为图像的底部不包含在内,而实际上它是在选择的时候。有点头疼。似乎在模拟器中和在设备上做同样的事情。任何人都知道为什么会这样吗?

Top crop bottom crop

4 个答案:

答案 0 :(得分:2)

这并不能解决显示裁剪框20px关闭的显示问题,但是当用户选择图像时,您可以通过执行以下操作来解决最终裁剪的图像错误:

// MARK: - UIImagePickerControllerDelegate

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated: true, completion: { [weak self] in self?.didCompleteSelection(image: nil) })
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    picker.dismiss(animated: true, completion: { [weak self] in
        guard
            let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage,
            let cropRect = info[UIImagePickerControllerCropRect] as? CGRect
        else { return }

        //crop with status-bar offset due to iOS bug introduced in iOS 8 with status bar offset
        let offsetRect = cropRect.offsetBy(dx: 0, dy: UIApplication.shared.statusBarFrame.size.height)
        guard let croppedImage = originalImage.cgImage?.cropping(to: offsetRect) else { return }

        self?.didCompleteSelection?(image: croppedImage)
    })
}

答案 1 :(得分:0)

问题在于状态栏显示在较新的设备上,它以不可预测的方式使作物偏移发生混乱。要轻松解决所有这些问题,只需:

1。。将以下属性添加到当前的ViewController中:

@property BOOL hideStatusBar;

2。。将以下方法添加到当前的ViewController中:

-(BOOL)prefersStatusBarHidden {
    return _hideStatusBar; 
}

-(UIViewController *)childViewControllerForStatusBarHidden {
    return nil; 
}

3。。将以下内容添加到显示imagePicker的方法文件中。还将UINavigationControllerDelegate添加到.h文件。
(注意:您可能已经声明了这些方法,因此只需在其中添加代码段即可)

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    YourCurrentViewController.hideStatusBar = YES;
    [YourCurrentViewController setNeedsStatusBarAppearanceUpdate];
    [navigationController setNeedsStatusBarAppearanceUpdate];

    //The rest of your code here

    //!IMPORTANT: ENSURE YOU'VE ADDED <UINavigationControllerDelegate> IN YOUR .H FILE

}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    YourCurrentViewController.hideStatusBar = NO;
    [YourCurrentViewController setNeedsStatusBarAppearanceUpdate];

    //The rest of your code here

}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    YourCurrentViewController.hideStatusBar = NO;
    [YourCurrentViewController setNeedsStatusBarAppearanceUpdate];

    //The rest of your code here

}

现在,当您启动图像选择器时,状态栏将隐藏,并且在完成图像选择或取消操作后将重新出现。隐藏状态栏后,可以在Apple端正确计算裁切偏移,并且可以正确裁切编辑后的照片!

答案 2 :(得分:0)

我最近遇到了这个问题。这是为我解决的问题:

_ "github.com/golang/protobuf/ptypes/wrappers"

plist中的“基于视图控制器的状态栏外观”必须为YES,否则将不会调用上述代码。

答案 3 :(得分:0)

对于任何有类似问题的人。 当 allowEditing 设置为 true 时,我遇到了照片顶部有一条黑线的图像问题。我在 iPhone 11、iOS 14 上对此进行了测试。

我发现造成这种情况的原因是设置了不同的 modalPresentationStyleUIImagePickerViewController。一旦我删除了这一行:

 picker.modalPresentationStyle = .overFullScreen

在委托方法中检索到的编辑图像大小正确。