graphicscore-graphicscatransform3d

"renderInContext:" and CATransform3D


I have a view that has multiple views inside it, and an image presentation (aka. 'cover flow') into that too... And I need to take a screenshot programmatically!

Since docs say that "renderInContext:" will not render 3d animations :

"Important The Mac OS X v10.5 implementation of this method does not support the entire Core Animation composition model. QCCompositionLayer, CAOpenGLLayer, and QTMovieLayer layers are not rendered. Additionally, layers that use 3D transforms are not rendered, nor are layers that specify backgroundFilters, filters, compositingFilter, or mask values. Future versions of Mac OS X may add support for rendering these layers and properties."

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

I have searched a lot, and my 'best' solution (that is not good at all), is to create my own CGContext and record all CG animations into it. But I really do not want to do it, because I will need to re-write most of my animation codes and it will be very expensive for memory... I found other solutions (some of them unmakable) as use openGL or capture through AVSessions, but no one that can help me...

What are my options? Any with that problem?


Solution

  • I got it working with protocols.... I'm implementing a protocol in all UIViews classes that make 3D transforms. So when I request a screenshot, it make all subviews screenshot, and generate one UIImage.. Not so good for lots of views, but I'm doing in a few views.

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

    I was thinking it may works now because I'm doing that render in the transformed view layer, which have being transformed it self... And it wasn't working because "renderInContext:" doesn't get layers of it subviews, may it possible ?

    Anyone interest in a bit more code of this solution, can be found here . in the apple dev forum.

    It may be a function bug, or it just not being design for this purpose ...