使用presentationlayer的renderincontext无法正常工作的屏幕截图

时间:2013-01-01 01:44:46

标签: objective-c ios cocoa-touch animation calayer

我按照说明here捕捉动画期间的截图(我正在尝试使用动画标签录制UIView以将其捕捉为视频)

这是我的ViewController(getframe)中的屏幕截图代码

-(UIImage*) getCurrentFrame {
    UIGraphicsBeginImageContext(self.view.bounds.size);
CGContextRef mycontext =  UIGraphicsGetCurrentContext();
    [[[self.view layer] presentationLayer] renderInContext:mycontext]; 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

当我尝试制作屏幕截图的视频时,我反复只看到开始帧 - 因为我的线程(使用AVAssetwriter示例)抓取后续屏幕截图屏幕抓取动作。在一个while循环中使用block的AVAssetWriterInput期间调用screengrab。

我的动画是标签上的简单核心动画 - 向下滚动示例

mTextLabel.frame = CGRectMake(mTextLabel.frame.origin.x,
                             -100,
                             mTextLabel.frame.size.width,
                             mTextLabel.frame.size.height);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration: delay];
[UIView setAnimationTransition:UIViewAnimationTransitionNone
                       forView:mTextLabel cache:YES];
mTextLabel.frame = CGRectMake(mTextLabel.frame.origin.x,
                             240,
                             mTextLabel.frame.size.width,
                             mTextLabel.frame.size.height);
[UIView commitAnimations];

我尝试使用块动画animatewithDuration替换旧的学校动画但得到相同的结果

有什么建议吗? 使用ios 6和最新的xcode(正确导入Quartzcore)

Apple开发中心said可能无法捕获某些内容。

是另一种选择,可以使用计时器暂停动画并间歇性地抓取屏幕(必须手动编码动画)?

1 个答案:

答案 0 :(得分:3)

编辑 - 万岁! Apple终于添加了这个 -

[view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:NO];

在Begin和End Graphics Context调用之间进行换行!

------------ iOS7前--------------- 来自Apple的CALayer文档here! 在renderInContext中,他们清楚地说

“重要:此方法的OS X v10.5实现不支持整个Core Animation组合模型。不会渲染QCCompositionLayer,CAOpenGLLayer和QTMovieLayer图层。此外,使用3D的图层不渲染变换,也不指定backgroundFilters,filters,compositingFilter或掩码值的图层。未来版本的OS X可能会添加对渲染这些图层和属性的支持。“

我唯一的选择是使用服务器端解决方案或通过在时间t手动覆盖转换来逐帧手动编码动画。