"renderInContext:" and CATransform3D

4
我有一个视图,里面包含多个子视图和一个图片演示(也称为“封面流”)... 我需要通过程序截取屏幕截图!
由于文档说明,“renderInContext:”不会渲染3D动画:
“重要的是,此方法的Mac OS X v10.5实现不支持整个核心动画组合模型。QCCompositionLayer、CAOpenGLLayer和QTMovieLayer图层不会被渲染。此外,不会渲染使用3D变换的图层,也不会渲染指定backgroundFilters、filters、compositingFilter或mask值的图层。未来版本的Mac OS X可能会添加对这些图层和属性的支持。”
来源:https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html 我已经搜索了很多,我的“最佳”解决方案(根本不好)是创建自己的CGContext,并将所有CG动画记录在其中。但我真的不想这样做,因为我将需要重新编写大部分动画代码,而且它将非常昂贵... 我找到了其他解决方案(其中一些无法实现),如使用openGL或通过AVSessions捕获,但没有一个能帮助我...
我的选择是什么?有人有这个问题吗?
感谢您的时间!
3个回答

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;
}

你正在使用哪些转换? - Wayne Hartman
是的,我试过了!真正的问题是,转换后的视图是从哪个视图中呈现的子视图。 - gwdp

0

我用协议使其正常运作了...... 我正在所有使3D变换的UIViews类中实现一个协议。因此,当我请求一个屏幕截图时,它将制作所有子视图的屏幕截图,并生成一个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:”无法获取其子视图的图层,这可能吗?

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

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


也许如果你在主UIWindow上使用我的先前函数,它也可以工作,那么它应该已经自动包含了所有视图。但无论如何,你已经解决了它 :) - Bob de Graaf

0

也许你可以使用Core Graphics而不是CATransform3DMakeRotation :)

CGAffineTransform flip = CGAffineTransformMakeScale(1.0, -1.0);

对 renderInContext 有什么影响


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接