2017-03-21 2 views
0

Je rencontre un problème avec la prise de vue instantanée de UIView avec CAEmitterLayer. Voici le code que je me sers pour prendre instantané:Problème avec drawViewHierarchyInRect: afterScreenMises à jour lors de la prise d'instantané

ici editingView est mon UIView:

UIGraphicsBeginImageContextWithOptions(editingView.bounds.size, NO, 0.0); 
[editingView drawViewHierarchyInRect:editingView.bounds afterScreenUpdates:YES]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

S'il vous plaît passer par les liens ci-dessous pour images gif

Lien Pour For afterScreenUpdates:NO (gif) dans ce cas où il me manque des données Snapshot

Lien Pour For afterScreenUpdates:YES (Gif) dans ce cas, uiview clignote puis est mis à jour et fait également face à des problèmes de performance.

Répondre

1

J'ai déjà eu un problème similaire dans le passé. Ce qui suit pourrait fonctionner pour vous une solution de contournement:

UIGraphicsBeginImageContextWithOptions(editingView.bounds.size, NO, 0.0); 
[editingView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Notez que vous risquez de perdre une certaine précision dans la capture d'écran, car il peut exclure brouille, et certaines fonctionnalités d'animation de base.

Edit:

Il semble y avoir des problèmes/compromis avec les deux renderInContext et drawViewHierarchyInRect. Le code suivant peut être la peine d'essayer (tiré de here pour référence):

- (CGContextRef) createBitmapContextOfSize:(CGSize) size { 
    CGContextRef context = NULL; 
    CGColorSpaceRef colorSpace; 
    int    bitmapByteCount; 
    int    bitmapBytesPerRow; 

    bitmapBytesPerRow = (size.width * 4); 
    bitmapByteCount  = (bitmapBytesPerRow * size.height); 
    colorSpace = CGColorSpaceCreateDeviceRGB(); 
    if (bitmapData != NULL) { 
     free(bitmapData); 
    } 
    bitmapData = malloc(bitmapByteCount); 
    if (bitmapData == NULL) { 
     fprintf (stderr, "Memory not allocated!"); 
     return NULL; 
    } 

    context = CGBitmapContextCreate (bitmapData, 
            size.width, 
            size.height, 
            8,  // bits per component 
            bitmapBytesPerRow, 
            colorSpace, 
            kCGImageAlphaNoneSkipFirst); 

    CGContextSetAllowsAntialiasing(context,NO); 
    if (context== NULL) { 
     free (bitmapData); 
     fprintf (stderr, "Context not created!"); 
     return NULL; 
    } 
    CGColorSpaceRelease(colorSpace); 

    CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, size.height); 
    CGContextConcatCTM(context, flipVertical); 

    return context; 
} 

Ensuite, vous pouvez faire:

CGContextRef context = [self createBitmapContextOfSize:editingView.bounds.size]; 
[editingView.layer renderInContext:context]; 

CGImageRef cgImage = CGBitmapContextCreateImage(context); 
UIImage* background = [UIImage imageWithCGImage: cgImage]; 
CGImageRelease(cgImage); 
+0

Salut Allan Poole, j'ai essayé cela. mais je n'ai pas réussi à obtenir une capture instantanée pour CAEmitterLayer avec UIView. pour cela, j'ai trouvé quelque chose en rapport avec Core Animations pouvez vous référer ce lien pour une idée rapide http://stackoverflow.com/questions/11926690/caemitterlayer-not-rendering-when-renderincontext-of-superlayer-is-called. et s'il vous plaît aidez-moi à ce sujet.Et s'il vous plaît passer par des liens gif que j'ai fourni –

+0

Il semble y avoir des problèmes/compromis avec les deux solutions. J'ai mis à jour ma réponse avec une alternative possible. Le code provient d'un article assez ancien, il peut ou peut ne pas fonctionner. –

+0

Ne fonctionne pas pour moi.missing CAEmitterLayer –