UIImagePickerController匹配默认裁剪的Camera Overlay

时间:2015-02-09 21:04:59

标签: ios xcode swift uiimage uiimagepickercontroller

这是我的问题。我正在使用UIImagePickerController从相机拍摄照片。在拍摄之后(因为我将allowEditing设置为TRUE),预览图像显示一个白色矩形,用于界定默认裁剪区域(看起来不在图片的中心)。

我想要的是设置一个与裁剪区域完全匹配的自定义相机覆盖,以便用户确切知道他拍摄的照片将是裁剪后产生的图像。

见下图,基本上我希望Camera Overlay只显示预览中表示裁剪矩形的红色矩形。 enter image description here

有关如何实现这一点的任何想法,它将适用于所有类型的Iphone设备(iphone 4,5,6,6 +)和人像/风景模式?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用以下第三方库 https://github.com/gekitz/GKImagePicker

self.myPicker = [[GKImagePicker alloc] init];

self.myPicker.delegate = self;

self.myPicker.cropSize = CGSizeMake([FunctionUtils getViewWidth], [FunctionUtils getViewWidth]/ratio);

并为其设置合适的裁剪尺寸。

答案 1 :(得分:0)

要在屏幕中央放置一个正方形,以便为用户提供关于相机聚焦位置的“指南”,请执行以下操作:

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()

BONUS 处理方向更改

在您创建UIImagePickerController

的课程中
// 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")