4

我有一个里面有多个视图的视图,还有一个图像演示(又名“封面流”)......而且我需要以编程方式制作屏幕截图!

由于文档说“renderInContext:”不会渲染 3d 动画:

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

来源:https ://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html

我进行了很多搜索,我的“最佳”解决方案(一点都不好)是创建自己的 CGContext 并将所有 CG 动画记录到其中。但我真的不想这样做,因为我需要重新编写我的大部分动画代码,而且这对内存来说非常昂贵......我发现了其他解决方案(其中一些是无法实现的),如使用 openGL 或通过捕获AVSessions,但没有人可以帮助我......

我有什么选择?有这个问题吗?

谢谢你的时间 !

4

3 回答 3

0

我让它与协议一起工作......我正在所有UIViews进行 3D 转换的类中实现一个协议。因此,当我请求截屏时,它会截取所有子视图,并生成一个 UIImage .. 对于很多视图来说不是很好,但我在几个视图中做。

#pragma mark - Protocol implementation 'TDITransitionCustomTransform'

//Conforms to "TDITransitionCustomTransform" protocol, return currrent image view state , by current layer

- (UIImage*)imageForCurrentState {

//Make print

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);

[self.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

//return printed image

return screenShot;

}

我在想它现在可能可以工作,因为我正在转换的视图层中进行渲染,它已经被自己转换了......它没有工作,因为“renderInContext:”没有得到它的子视图层,可能有可能吗?

任何对此解决方案的更多代码感兴趣的人都可以在这里找到。在苹果开发论坛。

它可能是一个功能错误,或者它不是为此目的而设计的......

于 2012-03-28T05:58:31.957 回答
0

你真的试过了吗?我目前正在开发一个具有多个 3D 转换的项目,当我尝试以编程方式制作此屏幕截图时,它工作得很好:) 这是我使用的代码:

-(UIImage *)getScreenshot
{
    CGFloat scale = 1.0;
    if([[UIScreen mainScreen]respondsToSelector:@selector(scale)])
    {        
        CGFloat tmp = [[UIScreen mainScreen]scale];
        if (tmp > 1.5)
        {
            scale = 2.0;    
        }
    }      
    if(scale > 1.5)
    {
        UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, scale);
    } 
    else
    {
        UIGraphicsBeginImageContext(self.frame.size);
    }    
    //SELF HERE IS A UIVIEW
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];    
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return screenshot;
}
于 2012-03-21T10:18:28.650 回答
0

可能你可以使用 Core Graphicaic 代替 CATransform3DMakeRotation :)

CGAffineTransform flip = CGAffineTransformMakeScale(1.0, -1.0);

哪个对 renderInContext 产生影响

于 2015-10-29T05:29:04.823 回答