“renderInContext:”和CATransform3D

时间:2012-03-02 08:36:32

标签: graphics core-graphics core catransform3d

我有一个视图,里面有视图,并且还有一个图像显示(也就是'封面流')......我需要以编程方式制作屏幕截图!

由于docs说“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,但没有人可以帮助我...

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

谢谢你的时间!

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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:”没有得到子视图的层,可能吗?

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

这可能是一个功能错误,或者它只是没有为此设计......

答案 2 :(得分:0)

可能你可以使用Core Graphaic而不是CATransform3DMakeRotation:)

CGAffineTransform flip = CGAffineTransformMakeScale(1.0, -1.0);

在renderInContext

上获取效果