Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何缩放CALayer以适应视频层_Ios_Objective C_Iphone_Swift_Uiview - Fatal编程技术网

Ios 如何缩放CALayer以适应视频层

Ios 如何缩放CALayer以适应视频层,ios,objective-c,iphone,swift,uiview,Ios,Objective C,Iphone,Swift,Uiview,我和CALayer有问题。关键是我想在这部电影上保留一些视图。基本上,我正试图通过CALayer来完成。一切正常,应用程序导出带有层的电影,但带有视图的层比视频帧小 我试图手动缩放图层,但根本不像屏幕上显示的那个样。如果我在电影中把UIView移得更高,它会变得更高 视频具有全高清帧,UIView的层次取决于用户在屏幕上的放置方式 问题是: -如何以更好的视网膜质量呈现UIView上下文 如何缩放层以完全适合视频 代码如下: VideoSaver.saveVideo(videoAsset!)

我和CALayer有问题。关键是我想在这部电影上保留一些视图。基本上,我正试图通过CALayer来完成。一切正常,应用程序导出带有层的电影,但带有视图的层比视频帧小

我试图手动缩放图层,但根本不像屏幕上显示的那个样。如果我在电影中把UIView移得更高,它会变得更高

视频具有全高清帧,UIView的层次取决于用户在屏幕上的放置方式

问题是: -如何以更好的视网膜质量呈现UIView上下文

  • 如何缩放层以完全适合视频
代码如下:

VideoSaver.saveVideo(videoAsset!) { (composition, size) in
        ////////////////
        //Parent Layer//
        ////////////////

        let parentLayer = CALayer()
        parentLayer.frame = CGRectMake(0, 0, size.width, size.height)

        /////////
        //Sizes//
        /////////
        let xScaleValue = CGRectGetWidth(parentLayer.frame)/CGRectGetWidth(self.view.frame)
        let yScaleValue = CGRectGetHeight(parentLayer.frame)/CGRectGetHeight(self.view.frame)

        ///////////////
        //Video Layer//
        ///////////////
        let videoLayer = CALayer()
        videoLayer.frame = CGRectMake(0, 0, size.width, size.height)

        //////////////////
        //Captions Layer//
        //////////////////

        //Creating UIImage from Captions
        UIGraphicsBeginImageContext(CGSizeMake(self.captionsTextView.bounds.size.width, self.captionsTextView.bounds.size.height+20))
        let currentContext = UIGraphicsGetCurrentContext()

        CGContextTranslateCTM(currentContext, 0, 16)

        self.captionsTextView.layer.renderInContext(currentContext!)
        let captionTextViewImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        let captionsOverlayLayer = CALayer()
        captionsOverlayLayer.contents = captionTextViewImage.CGImage
        captionsOverlayLayer.frame = CGRectMake(self.captionsTextView.frame.origin.x * xScaleValue,
                                            (size.height - ((self.captionsTextView.frame.origin.y - 20) * yScaleValue)),
                                            CGRectGetWidth(self.captionsTextView.frame) * xScaleValue,
                                            (CGRectGetHeight(self.captionsTextView.frame)+20) * yScaleValue)

        captionsOverlayLayer.masksToBounds = true

        ///////////////////
        //TagFilter Layer//
        ///////////////////
        UIGraphicsBeginImageContext(self.tagView.bounds.size)
        self.tagView.layer.renderInContext(UIGraphicsGetCurrentContext()!)

        let tagViewImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        let tagOverlayLayer = CALayer()
        tagOverlayLayer.contents = tagViewImage.CGImage
        tagOverlayLayer.frame = CGRectMake(self.tagView.frame.origin.x * xScaleValue,
                                           (size.height - ((self.tagView.frame.origin.y) * yScaleValue)),
                                           CGRectGetWidth(self.tagView.frame) * xScaleValue,
                                           (CGRectGetHeight(self.tagView.frame)) * yScaleValue)
        ///////////////////////////////////////////////

        parentLayer.addSublayer(videoLayer)
        parentLayer.addSublayer(captionsOverlayLayer)
        parentLayer.addSublayer(tagOverlayLayer)

        ///////////////
        //Composition//
        ///////////////
        composition.animationTool = AVVideoCompositionCoreAnimationTool.init(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer)
    }
我很乐意提供帮助:)

如果问题在于图层显示的图像分辨率,则:

  • 这是您的第一个错误:
    UIGraphicsBeginImageContext
    。始终调用
    UIGraphicsBeginImageContextWithOptions
    和第三个参数
    0
    ,或显式解析

  • 第二个错误是您从未设置CALayer的
    contentsCale


最后,我想在视频中显示的所有
UIView
都放在一个
UIView
中。从这个
ui视图
我创建了图层并将其缩放到视频大小。如果有人遇到同样的问题,则会有一个代码:

VideoSaver.saveVideo(videoAsset!) 
{ 
    (composition, size) in
    ////////////////
    //Parent Layer//
    ////////////////

    let parentLayer = CALayer()
    parentLayer.frame = CGRectMake(0, 0, size.width, size.height)

    ///////////////
    //Video Layer//
    ///////////////
    let videoLayer = CALayer()
    videoLayer.frame = CGRectMake(0, 0, size.width, size.height)

    ///////////////////////
    //Effect Layout Layer//
    ///////////////////////
    UIGraphicsBeginImageContextWithOptions(self.effectLayoutView.bounds.size, false, 0.0)
    self.effectLayoutView.layer.renderInContext(UIGraphicsGetCurrentContext()!)

    let effectLayoutViewImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    let effectOverlayLayer = CALayer()
    effectOverlayLayer.contents = effectLayoutViewImage.CGImage

    effectOverlayLayer.frame = CGRectMake(0, 0, size.width, size.height)
    effectOverlayLayer.masksToBounds = true

    ///////////////////////////////////////////////

    parentLayer.addSublayer(videoLayer)
    parentLayer.addSublayer(effectOverlayLayer)

    ///////////////
    //Composition//
    ///////////////
    composition.animationTool = AVVideoCompositionCoreAnimationTool.init(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer)
}

如果我理解正确,我必须添加到每个CALayer
contentScale=self.myView.layer.contentsScale
?我还更改了
UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.captionsTextView.bounds.size.width,self.captionsTextView.bounds.size.height+20),false,0.0)
。不幸的是,我不知道如何将层调整为视频大小:(好吧,这里已经详细介绍了您正在做的事情;例如,请参阅教程,以及类似我遇到相同问题的教程,父层的子层没有根据视频层大小调整大小。您能帮我吗?您已经添加了parentLayer.addSublayer(videoLayer)parentLayer.addSublayer(effectoverlayer)为什么?