swift - AVCaptureVideoPreviewLayer y vista previa de la posición de la cámara
sdk ios8 (3)
Estoy desarrollando una aplicación que permite al usuario tomar fotos. Empecé a utilizar AVCam apple, pero tengo un problema. Simplemente no puedo colocar la capa de la cámara donde quiero, pero está posicionada automáticamente en el centro de la vista.
En el lado izquierdo puede ver lo que realmente tengo, en el lado derecho lo que me gustaría tener. La Vista que contiene la vista previa que proviene de la cámara es una subclase UIView
y este es el código
class AVPreviewView : UIView {
override class func layerClass() -> AnyClass {
return AVCaptureVideoPreviewLayer.self
}
func session () -> AVCaptureSession {
return (self.layer as AVCaptureVideoPreviewLayer).session
}
func setSession(session : AVCaptureSession) -> Void {
(self.layer as AVCaptureVideoPreviewLayer).session = session;
(self.layer as AVCaptureVideoPreviewLayer).videoGravity = AVLayerVideoGravityResizeAspect;
}
}
Cualquier ayuda es apreciada
Lo que está viendo no es la capa colocada tanto como el aspecto de la vista / capa no coincide con la relación de aspecto de la cámara, por lo que está usando la propiedad videoGravity
y el aspecto que la llena (lo que siempre implica centrado )
Cuando crees la capa, ajústala para que la relación de aspecto sea correcta, y luego colócala a voluntad. O, en este caso, cambie el tamaño de la vista a la relación de aspecto correcta, luego la vista se puede colocar a voluntad.
Primero obtenga el tamaño de su pantalla para que pueda calcular la relación de aspecto
let screenWidth = UIScreen.mainScreen().bounds.size.width
let screenHeight = UIScreen.mainScreen().bounds.size.height
var aspectRatio: CGFloat = 1.0
var viewFinderHeight: CGFloat = 0.0
var viewFinderWidth: CGFloat = 0.0
var viewFinderMarginLeft: CGFloat = 0.0
var viewFinderMarginTop: CGFlaot = 0.0
Ahora calcule el tamaño de la capa de vista previa.
func setSession(session : AVCaptureSession) -> Void {
if screenWidth > screenHeight {
aspectRatio = screenHeight / screenWidth * aspectRatio
viewFinderWidth = self.bounds.width
viewFinderHeight = self.bounds.height * aspectRatio
viewFinderMarginTop *= aspectRatio
} else {
aspectRatio = screenWidth / screenHeight
viewFinderWidth = self.bounds.width * aspectRatio
viewFinderHeight = self.bounds.height
viewFinderMarginLeft *= aspectRatio
}
(self.layer as AVCaptureVideoPreviewLayer).session = session;
Establezca el videoGravity
la capa en AVLayerVideoGravityResizeAspectFill
para que la capa se estire para rellenar dada su vista personalizada.
(self.layer as AVCaptureVideoPreviewLayer).videoGravity = AVLayerVideoGravityResizeAspectFill;
Finalmente, establezca el marco de la capa de vista previa en los valores calculados anteriormente con cualquier desplazamiento que desee.
(self.layer as AVCaptureVideoPreviewLayer).frame = CGRectMake(viewFinderMarginLeft, viewFinderMarginTop, viewFinderWidth, viewFinderHeight)
}
Esto puede requerir algunos ajustes, ya que no lo he probado en vivo, pero debería poder crear una VideoPreviewArea más flexible delimitada por los límites de su APPreviewView.
Me encontré con este problema y el código proporcionado no solucionó la situación aunque el código estaba funcionando. He estado construyendo mi aplicación usando el constructor de interfaz.
En el inspector de atributos, debajo de los bordes extendidos, hay ajustes que permiten extender toda la vista debajo de las barras superiores y debajo de las barras inferiores. Mi configuración los había revisado, lo que arrojaba cálculos para el posicionamiento de la vista.
Amplíe la configuración de bordes: