2015-02-25 5 views
0

Mon application iPad peut effectuer une capture d'écran de tous les contrôleurs de vue affichés à l'exception d'un VC scenekit 3D.Capture d'écran avec des contrôleurs de vues mixtes, kit de scène 3D, uiwebkit

Voici mon code pour capturer l'écran

@IBAction func screenImage(sender: UIBarButtonItem) { 

    //Create the UIImage 
    UIGraphicsBeginImageContext(view.frame.size) 
    view.layer.renderInContext(UIGraphicsGetCurrentContext()) 
    let screenshot: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    //Save it to the camera roll 
    UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil) 

    //save to user documents access via iTunes 
    CaptureOutput.saveImage(screenshot) 

    } 

J'ai mis le VC capture d'écran au niveau le plus élevé atIndex, tous les autres VC sont moins atIndex que cela.

du programme

capture from program

pris avec mon téléphone. capture from external phone

Dois-je forcer le rendu du kit de scène? Si c'est le cas, comment? De l'aide?

Il y a un bug confirmé (numéro radar 17851775)

Et ils ont aussi fourni une solution de contournement. Ils ont suggéré qu'au lieu de:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0); 
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES]; 
UIImage *im = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
/* Use im */ 

Je fais

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *im = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

L'inverse, en fait. Au lieu de renderInContext, appelez drawViewHierarchy. – Mercurial

Répondre

3

La méthode recommandée pour capturer une vue depuis iOS 7 est d'utiliser drawViewHierarchyInRect:afterScreenUpdates: (ou l'une des autres méthodes énumérées à côté sous Capture d'un instantané de vue dans les documents). Cela attrape des choses qui ne sont pas dans le contenu de CALayer, qui je crois inclut le contenu OpenGL rendu par SceneKit.

Notez que si vous avez uniquement besoin de capturer la vue SceneKit et non le reste de la hiérarchie de vue, vous pouvez simplement utiliser la méthode SCNViewsnapshot.

Cependant, aucun d'entre eux n'attrape le reflet de vos mains et de votre téléphone.

+0

cela a fonctionné 'view.drawViewHierarchyInRect (view.bounds, afterScreenUpdates: true)' –