UIImagePickerController Camera Overlay 匹配默认裁剪
UIImagePickerController Camera Overlay that matches the default cropping
这是我的问题。我正在使用 UIImagePickerController 从相机拍摄照片。拍摄后(因为我将 allowsEditing 设置为 TRUE),预览图像显示一个白色矩形,它界定了默认裁剪区域(它似乎不在图片的中心)。
我想要的是设置一个与裁剪区域完全匹配的自定义相机叠加层,以便用户确切知道他拍摄的照片将是裁剪后的结果图像。
见下图,基本上我希望 Camera Overlay 在预览中只显示代表裁剪矩形的红色矩形。
关于如何实现它以便它适用于所有类型的 Iphone 设备(iphone 4、5、6、6 plus)和 Portrait/Landscape 模式的任何想法?
感谢您的帮助。
您可以使用以下第3方库
https://github.com/gekitz/GKImagePicker
self.myPicker = [[GKImagePicker alloc] init];
self.myPicker.delegate = self;
self.myPicker.cropSize = CGSizeMake([FunctionUtils getViewWidth], [FunctionUtils getViewWidth]/ratio);
并为其设置适当的裁剪大小。
要在屏幕中央放置一个正方形,让用户'guide'知道他们应该将相机聚焦在哪里,请执行以下操作:
1) 添加扩展到 UIScreen
并根据屏幕的高度或宽度获得精确的正方形(取决于是否横向):
extension UIScreen {
func fullScreenSquare() -> CGRect {
var hw:CGFloat = 0
var isLandscape = false
if UIScreen.main.bounds.size.width < UIScreen.main.bounds.size.height {
hw = UIScreen.main.bounds.size.width
}
else {
isLandscape = true
hw = UIScreen.main.bounds.size.height
}
var x:CGFloat = 0
var y:CGFloat = 0
if isLandscape {
x = (UIScreen.main.bounds.size.width / 2) - (hw / 2)
}
else {
y = (UIScreen.main.bounds.size.height / 2) - (hw / 2)
}
return CGRect(x: x, y: y, width: hw, height: hw)
}
func isLandscape() -> Bool {
return UIScreen.main.bounds.size.width > UISc reen.main.bounds.size.height
}
}
2) 然后编写一个方法,你将利用它来为相机覆盖创建一个指南:
func guideForCameraOverlay() -> UIView {
let guide = UIView(frame: UIScreen.main.fullScreenSquare())
guide.backgroundColor = UIColor.clear
guide.layer.borderWidth = 4
guide.layer.borderColor = UIColor.red.cgColor
guide.isUserInteractionEnabled = false
return guide
}
3) 将指南添加到您的叠加层:
picker.cameraOverlayView = guideForCameraOverlay()
奖金 处理方向变化
在您创建 UIImagePickerController
的 class 中:
// Add this line where you instantiate your image picker
self.imagePicker.view.layer.addObserver(self, forKeyPath: "bounds", options: .new, context: nil)
并监听相机上的边界变化以重置屏幕中央的指南:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "bounds" {
if let picker = mediaPicker, picker.cameraCaptureMode == .photo {
picker.cameraOverlayView = nil
picker.cameraOverlayView = guideForCameraOverlay()
}
}
}
完成后别忘了移除观察者:
self.imagePicker.view.layer.removeObserver(self, forKeyPath: "bounds")
这是我的问题。我正在使用 UIImagePickerController 从相机拍摄照片。拍摄后(因为我将 allowsEditing 设置为 TRUE),预览图像显示一个白色矩形,它界定了默认裁剪区域(它似乎不在图片的中心)。
我想要的是设置一个与裁剪区域完全匹配的自定义相机叠加层,以便用户确切知道他拍摄的照片将是裁剪后的结果图像。
见下图,基本上我希望 Camera Overlay 在预览中只显示代表裁剪矩形的红色矩形。
关于如何实现它以便它适用于所有类型的 Iphone 设备(iphone 4、5、6、6 plus)和 Portrait/Landscape 模式的任何想法?
感谢您的帮助。
您可以使用以下第3方库 https://github.com/gekitz/GKImagePicker
self.myPicker = [[GKImagePicker alloc] init];
self.myPicker.delegate = self;
self.myPicker.cropSize = CGSizeMake([FunctionUtils getViewWidth], [FunctionUtils getViewWidth]/ratio);
并为其设置适当的裁剪大小。
要在屏幕中央放置一个正方形,让用户'guide'知道他们应该将相机聚焦在哪里,请执行以下操作:
1) 添加扩展到 UIScreen
并根据屏幕的高度或宽度获得精确的正方形(取决于是否横向):
extension UIScreen {
func fullScreenSquare() -> CGRect {
var hw:CGFloat = 0
var isLandscape = false
if UIScreen.main.bounds.size.width < UIScreen.main.bounds.size.height {
hw = UIScreen.main.bounds.size.width
}
else {
isLandscape = true
hw = UIScreen.main.bounds.size.height
}
var x:CGFloat = 0
var y:CGFloat = 0
if isLandscape {
x = (UIScreen.main.bounds.size.width / 2) - (hw / 2)
}
else {
y = (UIScreen.main.bounds.size.height / 2) - (hw / 2)
}
return CGRect(x: x, y: y, width: hw, height: hw)
}
func isLandscape() -> Bool {
return UIScreen.main.bounds.size.width > UISc reen.main.bounds.size.height
}
}
2) 然后编写一个方法,你将利用它来为相机覆盖创建一个指南:
func guideForCameraOverlay() -> UIView {
let guide = UIView(frame: UIScreen.main.fullScreenSquare())
guide.backgroundColor = UIColor.clear
guide.layer.borderWidth = 4
guide.layer.borderColor = UIColor.red.cgColor
guide.isUserInteractionEnabled = false
return guide
}
3) 将指南添加到您的叠加层:
picker.cameraOverlayView = guideForCameraOverlay()
奖金 处理方向变化
在您创建 UIImagePickerController
的 class 中:
// Add this line where you instantiate your image picker
self.imagePicker.view.layer.addObserver(self, forKeyPath: "bounds", options: .new, context: nil)
并监听相机上的边界变化以重置屏幕中央的指南:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "bounds" {
if let picker = mediaPicker, picker.cameraCaptureMode == .photo {
picker.cameraOverlayView = nil
picker.cameraOverlayView = guideForCameraOverlay()
}
}
}
完成后别忘了移除观察者:
self.imagePicker.view.layer.removeObserver(self, forKeyPath: "bounds")