【问题标题】:AVCaptureVideoPreviewLayer and preview from camera positionAVCaptureVideoPreviewLayer 和从相机位置预览
【发布时间】:2015-04-13 08:39:21
【问题描述】:

我正在开发一个允许用户拍照的应用程序。 我已经开始使用苹果提供的AVCam 但实际上我遇到了问题 只是我无法将相机层定位在我想要的位置,但它会自动定位在视图的中心

在左侧,您可以看到我实际拥有的东西,在右侧,您可以看到我想要拥有的东西。 包含来自相机的预览的 View 是 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;

    }
}

感谢任何帮助

【问题讨论】:

    标签: swift sdk ios8 avcapture


    【解决方案1】:

    首先获取你的屏幕尺寸,以便计算纵横比

        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 的边界分隔。

    【讨论】:

      【解决方案2】:

      您所看到的不是图层的位置,而是视图/图层的纵横比与相机的纵横比不匹配,因此它使用了videoGravity 属性和纵横比填充它(这总是意味着居中)

      创建图层时,调整其大小以使纵横比正确,然后随意放置。或者,在这种情况下,将视图调整为正确的纵横比,然后可以随意定位视图。

      【讨论】:

        【解决方案3】:

        我遇到了这个问题,即使代码正常工作,提供的代码也不能解决问题。我一直在使用界面生成器构建我的应用程序。

        在属性检查器中,在扩展边缘下有一些设置,所有视图都可以在顶部栏和底部栏下扩展。我的设置检查了这些,这会导致视图定位的计算失败。

        扩展边缘设置:

        【讨论】:

          【解决方案4】:

          我遇到了类似的问题,我解决了这个问题:

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

          希望这可以帮助:)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-05-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多