2012-03-02 3 views
4

J'ai une vue qui a plusieurs vues à l'intérieur, et une présentation d'image (aussi appelée 'flux de couverture') dans cela aussi ... Et j'ai besoin de faire une capture d'écran par programme!"renderInContext:" et CATransform3D

Depuis docs dit que "renderInContext:" ne sera pas rendu des animations 3D.

« Important La mise en œuvre Mac OS X v10.5 de cette méthode ne prend pas en charge l'ensemble du modèle de composition Core Animation QCCompositionLayer, CAOpenGLLayer et Les calques QTMovieLayer ne sont pas restitués, pas plus que les calques qui utilisent backgroundFilters, filters, compositingFilter ou les valeurs de masque, et les versions ultérieures de Mac OS X peuvent prendre en charge le rendu de ces calques et propriétés.

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

J'ai beaucoup cherché, et ma « meilleure » solution (ce n'est pas bon du tout), est de créer mon propre CGContext et enregistrer toutes les animations CG en elle. Mais je ne veux vraiment pas le faire, car je vais devoir réécrire la plupart de mes codes d'animations et ça va coûter très cher pour la mémoire ... J'ai trouvé d'autres solutions (certaines d'entre elles inmakables) que l'utilisation d'openGL ou de capture par AVSessions, mais personne ne peut m'aider ...

Quelles sont mes options? Tout avec ce problème?

Merci pour votre temps!

Répondre

0

Je l'ai travailler avec des protocoles. ... J'implémente un protocole dans toutes les classes UIViews qui font des transformations 3D. Donc, quand je demande une capture d'écran, il fait toutes les captures d'écran de sous-vues, et génère un UIImage .. Pas si bon pour beaucoup de vues, mais je le fais dans quelques vues.

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

} 

Je pensais que ce peut fonctionne maintenant parce que je le fais dans la couche render de vue transformée, qui ont se transformer elle-même ... Et ça ne marchait pas parce que « renderInContext: » n » t obtenir des couches de sous-vues, est-ce possible?

Tout intéressé par un peu plus de code de cette solution, peut être trouvé here. dans le forum apple dev.

Il est peut-être un bug de la fonction, ou tout simplement pas être conception à cet effet ...

+0

peut-être que cela fonctionne également si vous utilisez ma fonction précédente mais que vous l'utilisez sur l'UIWindow principale, alors il devrait automatiquement avoir toutes les vues déjà à l'intérieur. Mais de toute façon, vous l'avez déjà résolu :) –

0

l'avez vous déjà essayé? Je travaille actuellement sur un projet avec plusieurs transformations 3D, et lorsque je tente de faire cette capture d'écran par programmation, il fonctionne très bien :) Voici le code que j'utilise:

-(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; 
} 
+0

Quelles transformations utilisez-vous? –

+0

Ouais, j'ai essayé! Le vrai problème, c'est que les vues transformées sont des enfants à partir de quelle vue je rendais le rendu pour la capture d'écran. – gwdp

0

peut être vous pouvez utiliser Core Graphaic au lieu de CATransform3DMakeRotation :)

CGAffineTransform flip = CGAffineTransformMakeScale(1.0, -1.0); 

qui se sur effet the renderInContext

Questions connexes