AVCaptureVideoPreviewLayer 和从相机位置预览
AVCaptureVideoPreviewLayer and preview from camera position
我正在开发一个允许用户拍照的应用程序。
我已经开始使用苹果提供的 AVCam 但我实际上遇到了问题
只是我无法将相机层定位在我想要的位置,但它会自动定位在视图的中心
在左边你可以看到我实际拥有的东西,在右边你可以看到我想要的东西。
包含来自相机的预览的视图是 UIView
子类,这是代码
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;
}
}
感谢任何帮助
首先获取屏幕尺寸,以便计算宽高比
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
现在计算预览图层的大小。
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;
将图层的 videoGravity
设置为 AVLayerVideoGravityResizeAspectFill
,以便图层拉伸以填充给定的自定义视图。
(self.layer as AVCaptureVideoPreviewLayer).videoGravity = AVLayerVideoGravityResizeAspectFill;
最后,将预览图层的框架设置为上面计算的值以及您喜欢的任何偏移量。
(self.layer as AVCaptureVideoPreviewLayer).frame = CGRectMake(viewFinderMarginLeft, viewFinderMarginTop, viewFinderWidth, viewFinderHeight)
}
这可能需要一些调整,因为我还没有对其进行实时测试,但您应该能够创建一个更灵活的 VideoPreviewArea,由您的 APPreviewView 的边界分隔。
你看到的不是层的定位,而是 view/layer 的纵横比与相机的纵横比不匹配,所以它使用的是 videoGravity
属性 和方面填充它(这总是意味着居中)
创建图层时,调整其大小以使纵横比正确,然后随意放置。或者,在这种情况下,将视图调整为正确的纵横比,然后视图可以随意定位。
我 运行 遇到了这个问题,提供的代码没有解决问题,即使代码可以正常工作。我一直在使用界面生成器构建我的应用程序。
在扩展边缘下的属性检查器中有设置,所有视图都将在顶部栏和底部栏下扩展。我的设置已经检查了这些,这会导致视图定位的计算中断。
扩展边设置:
我有一个类似的问题,我这样做解决了它:
previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
previewLayer.anchorPoint = videoLayer.bounds.origin
previewLayer.frame = CGRect(x: videoLayer.bounds.origin.x, y: videoLayer.bounds.origin.y, width: videoLayer.frame.size.width, height: videoLayer.frame.size.height)
videoLayer.layer.addSublayer(previewLayer)
captureSession.startRunning()
希望对您有所帮助:)
我正在开发一个允许用户拍照的应用程序。 我已经开始使用苹果提供的 AVCam 但我实际上遇到了问题 只是我无法将相机层定位在我想要的位置,但它会自动定位在视图的中心
在左边你可以看到我实际拥有的东西,在右边你可以看到我想要的东西。
包含来自相机的预览的视图是 UIView
子类,这是代码
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;
}
}
感谢任何帮助
首先获取屏幕尺寸,以便计算宽高比
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
现在计算预览图层的大小。
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;
将图层的 videoGravity
设置为 AVLayerVideoGravityResizeAspectFill
,以便图层拉伸以填充给定的自定义视图。
(self.layer as AVCaptureVideoPreviewLayer).videoGravity = AVLayerVideoGravityResizeAspectFill;
最后,将预览图层的框架设置为上面计算的值以及您喜欢的任何偏移量。
(self.layer as AVCaptureVideoPreviewLayer).frame = CGRectMake(viewFinderMarginLeft, viewFinderMarginTop, viewFinderWidth, viewFinderHeight)
}
这可能需要一些调整,因为我还没有对其进行实时测试,但您应该能够创建一个更灵活的 VideoPreviewArea,由您的 APPreviewView 的边界分隔。
你看到的不是层的定位,而是 view/layer 的纵横比与相机的纵横比不匹配,所以它使用的是 videoGravity
属性 和方面填充它(这总是意味着居中)
创建图层时,调整其大小以使纵横比正确,然后随意放置。或者,在这种情况下,将视图调整为正确的纵横比,然后视图可以随意定位。
我 运行 遇到了这个问题,提供的代码没有解决问题,即使代码可以正常工作。我一直在使用界面生成器构建我的应用程序。
在扩展边缘下的属性检查器中有设置,所有视图都将在顶部栏和底部栏下扩展。我的设置已经检查了这些,这会导致视图定位的计算中断。
扩展边设置:
我有一个类似的问题,我这样做解决了它:
previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
previewLayer.anchorPoint = videoLayer.bounds.origin
previewLayer.frame = CGRect(x: videoLayer.bounds.origin.x, y: videoLayer.bounds.origin.y, width: videoLayer.frame.size.width, height: videoLayer.frame.size.height)
videoLayer.layer.addSublayer(previewLayer)
captureSession.startRunning()
希望对您有所帮助:)