Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIImagePickerController允许编辑时显示错误的裁剪_Ios_Objective C_Uiimage_Uiimagepickercontroller - Fatal编程技术网

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

Ios UIImagePickerController允许编辑时显示错误的裁剪,ios,objective-c,uiimage,uiimagepickercontroller,Ios,Objective C,Uiimage,Uiimagepickercontroller,我对UIImagePickerController有问题,我启用了编辑功能,但是当用户裁剪图像时,方形裁剪显示用户将要裁剪的图像与实际裁剪之间存在y偏移。它只能在20像素左右工作,但现在是一个大问题。我已经包括了两个屏幕截图来演示这个问题。在第一种情况下,裁剪正方形似乎延伸到图像上方,但当选择了inage时,图像的顶部设置正确(图像只是一个屏幕截图,因此图像的顶部是状态栏的顶部)。在第二个屏幕截图中,如果您尝试将裁剪放在照片的最底部,它会弹回到这个位置,因此用户认为图像的底部不包括在内,而事实上

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


这并不能解决显示裁剪框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。将以下属性添加到当前ViewController:

@property BOOL hideStatusBar;
-(BOOL)prefersStatusBarHidden {
    return _hideStatusBar; 
}

-(UIViewController *)childViewControllerForStatusBarHidden {
    return nil; 
}
2.将以下方法添加到当前的ViewController:

@property BOOL hideStatusBar;
-(BOOL)prefersStatusBarHidden {
    return _hideStatusBar; 
}

-(UIViewController *)childViewControllerForStatusBarHidden {
    return nil; 
}
3.将以下内容添加到显示imagePicker的方法文件中。还要将UINavigationControllerDelegate添加到.h文件中。
(注意:您可能已经声明了这些方法,所以只需在其中添加代码段即可)

-(void)导航控制器:(UINavigationController*)导航控制器将显示视图控制器:(UIViewController*)视图控制器已设置动画:(BOOL)已设置动画{
YourCurrentViewController.hideStatusBar=是;
[YourCurrentViewController设置需要StatusBarAppearanceUpdate];
[导航控制器设置需要StatusBarAppearanceUpdate];
//这里是您的其余代码
//!重要提示:确保已在.H文件中添加
}
-(void)imagePickerController:(UIImagePickerController*)picker未使用信息完成PickingMediaWithInfo:(NSDictionary*)信息{
YourCurrentViewController.hideStatusBar=否;
[YourCurrentViewController设置需要StatusBarAppearanceUpdate];
//这里是您的其余代码
}
-(无效)ImagePickerController IDCancel:(UIImagePickerController*)选择器{
YourCurrentViewController.hideStatusBar=否;
[YourCurrentViewController设置需要StatusBarAppearanceUpdate];
//这里是您的其余代码
}

现在,当您启动imagePicker时,状态栏将隐藏,并在完成图像拾取或取消后重新显示。隐藏状态栏后,裁剪偏移将在苹果端正确计算,您编辑的照片将被正确裁剪

我最近遇到了这个问题。以下是为我修复的:

extension UIImagePickerController {
    open override var childForStatusBarHidden: UIViewController? {
        return nil
    }
    
    open override var prefersStatusBarHidden: Bool {
        return true
    }
}

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

适用于有类似问题的任何人。 当
allowEditing
设置为true时,我发现照片顶部有一条黑线。我在iPhone11和iOS 14上测试了这个

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

 picker.modalPresentationStyle = .overFullScreen

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

我的第一个想法是,在两个参考视图之间转换rect存在一些问题。在第二个屏幕盖中,您的图像正在渲染到手机顶部,而在第一个屏幕盖中,您的图像正在渲染到菜单顶部?我不确定将图像渲染到手机顶部和菜单顶部是什么意思。我可能没有通过使用iPhone的屏幕截图作为示例图像来简化这一过程。你指的是哪个菜单,看起来图像渲染到的视图与显示的视图不同,但我找不到任何明显的原因,间隙与状态栏或导航栏等的大小不相同!我想弄明白这件事已经有一段时间了。很有趣。在iOS 14中不为我工作。