UIImagePickerController Superposition de camera que coincide con el recorte pnetworkingeterminado

Este es mi problema Estoy usando UIImagePickerController para tomar una foto de la camera. Después de que se haya tomado (y porque establezco que permite editar a VERDADERO), la image de vista previa muestra un rectángulo blanco que delimita el área de recorte pnetworkingeterminada (que no parece estar en el centro de la image).

Lo que quiero es configurar una superposition de camera personalizada que coincida exactamente con ese área de recorte para que el usuario sepa exactamente que la image que tomó será la image resultante después de recortar.

Vea la image a continuación, básicamente, quiero que la superposition de camera solo muestre el rectángulo rojo que representa el rectángulo de recorte en la vista previa. introduzca la descripción de la imagen aquí

¿Alguna idea sobre cómo implementar esto para que funcione en todo tipo de dispositivo Iphone (iPhone 4, 5, 6, 6 más) y en el modo Retrato / Paisaje?

Gracias por tu ayuda.

Puede usar la siguiente biblioteca de terceros https://github.com/gekitz/GKImagePicker

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

y establezca el tamaño de cosecha adecuado para el mismo.

Para colocar un cuadrado en el centro de la pantalla para darle al usuario una 'guía' sobre dónde deben enfocar la camera, haga lo siguiente:


1) Agregue una extensión a UIScreen y obtenga un cuadrado exacto en function de la altura o el ancho de la pantalla (dependiendo de si está en paisaje o no):

 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) Luego escriba un método que utilizará para crear una guía para la superposition de la camera:

 func guideForCameraOverlay() -> UIView { let guide = UIView(frame: UIScreen.main.fullScreenSquare()) guide.backgroundColor = UIColor.clear guide.layer.borderWidth = 4 guide.layer.borderColor = UIColor.networking.cgColor guide.isUserInteractionEnabled = false return guide } 

3) Agregue la guía a su superposition:

picker.cameraOverlayView = guideForCameraOverlay()


Cambio de orientación de la manija de BONUS

En la class en la que crea su UIImagePickerController :

 // Add this line where you instantiate your image picker self.imagePicker.view.layer.addObserver(self, forKeyPath: "bounds", options: .new, context: nil) 

Y escuche los cambios de límites en la camera para restablecer la guía en el centro de la pantalla:

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

Y no te olvides de eliminar al observador cuando hayas terminado:

self.imagePicker.view.layer.removeObserver(self, forKeyPath: "bounds")