2017-03-21 2 views
0

UIViewのスナップショットを取る問題に直面しています。これはCAEmitterLayerです。 editingViewここIssue with drawViewHierarchyInRect:スナップショットを取っている間にafterScreenUpdates

UIViewです::以下は、私はスナップショットを取るために使用していたコードである

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

For afterScreenUpdates:NO用GIF画像については、以下のリンクを経由してください

リンク(GIF)この中にケーススナップショットデータがありません

リンクFor afterScreenUpdates:YES(Gif)この場合、uiviewは点滅して更新され、パフォーマンス上の問題もあります。

答えて

1

これまで同様の問題がありました。次は、回避策として、あなたのために働くかもしれない:それはブラー、およびいくつかのコア・アニメーション機能を除外することができるようあなたは、画面キャプチャで、いくつかの精度を失う可能性が

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

注意を。

編集:

renderInContextdrawViewHierarchyInRect両方の問題/トレードオフがあるようです。

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

次に、あなたが行うことができます:次のコードは、(参考のためにhereから取られた)試してみる価値があるかもしれ

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

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

こんにちはアランプール、私はこれを試してみました。私はUIViewと一緒にCAEmitterLayerのスナップショットを取得することに失敗しました。このために私は何かを見つけました。関連するコアアニメーションは、クイックアイデアのためにこのリンクを参照できますか?http://stackoverflow.com/questions/11926690/caemitterlayer-not-rendering-when-renderincontext-of-superlayer-is-called。これに関して私を助けてください。そして、私が提供したgifリンクを通してください。 –

+0

両方の解決策で問題/トレードオフがあるようです。私は可能な選択肢で私の答えを更新しました。コードはかなり古い記事のものなので、うまく動作しないかもしれません。 –

+0

me.missingで動作しませんCAEmitterLayer –