我遇到UIImagePickerController
的问题,我已经启用了编辑,但是当用户裁剪图像时,正方形裁剪显示用户将是裁剪之间存在偏差,以及实际作物是什么。它只能在大约20像素的情况下工作,但现在是个大问题。我已经包含两个演示此问题的屏幕截图。在第一个中,裁剪方块似乎延伸到图像上方,但是当选择inage时,图像的顶部被正确设置(图像只是一个屏幕截图,因此图像的顶部是状态栏的顶部)。在第二个屏幕截图中,如果您尝试将裁剪放到照片的最底部,它会弹回到此位置,因此用户认为图像的底部不包含在内,而实际上它是在选择的时候。有点头疼。似乎在模拟器中和在设备上做同样的事情。任何人都知道为什么会这样吗?
答案 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 上对此进行了测试。
我发现造成这种情况的原因是设置了不同的 modalPresentationStyle
为 UIImagePickerViewController
。一旦我删除了这一行:
picker.modalPresentationStyle = .overFullScreen
在委托方法中检索到的编辑图像大小正确。