2013-11-25 15 views
24

Ist es möglich, einen UIImage von einer UIView zu erhalten, die mit snapshotViewAfterScreenUpdates erstellt wurde?UIImage aus einer UIView, die mit snapshotViewAfterScreenUpdates erstellt wurde:

A UIView aus snapshotViewAfterScreenUpdates zurück sieht gut aus, wenn sie als ein Subview hinzugefügt, aber die folgenden erzeugt ein schwarzes Bild:

UIView *snapshotView = [someView snapshotViewAfterScreenUpdates:YES]; 
UIImage *snapshotImage = [self imageFromView:snapshotView]; 

- (UIImage *)imageFromView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0); 
    // [view.layer renderInContext:UIGraphicsGetCurrentContext()]; // <- same result... 
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO]; 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return img; 
} 

Es ist natürlich möglich, das Bild zu erhalten, ohne sich auf snapshotViewAfterScreenUpdates:

UIImage *snapshotImage = [self imageFromView:someView]; 

Leider kann drawViewHierarchyInRect beim Erfassen einer komplexen Ansicht nicht mit der Geschwindigkeit snapshotViewAfterScreenUpdates übereinstimmen. Ich hatte gehofft, dass es schneller wäre, die UIImage von einer Ansicht zu erhalten, die von snapshotViewAfterScreenUpdates erzeugt wird, ist das möglich?

Antwort

20

Die Antwort scheint NO und Apples documentation implizit bestätigt dies zu sein:

Wenn Sie eine grafische Wirkung, wie Unschärfe anwenden, zu einem Schnappschuss, verwenden Sie die drawViewHierarchyInRect:afterScreenUpdates: Methode statt.

Es ist erwähnenswert, dass die Engaging UI Implementierung auf iOS Sitzung von WWDC13 snapshotViewAfterScreenUpdates als die schnellste Methode auflistet, sondern nutzt drawViewHierarchyInRect im Beispielcode.

+2

Ich denke, der Grund, warum dies nicht funktioniert, ist, dass die von Snapshot zurückgegebene Ansicht tatsächlich keine vollständige Ansicht ist. Wenn Sie den Debugger durchlaufen, sehen Sie, dass der Typ '_UIReplicantView' ist. Dies lässt mich denken, dass es nur eine optimierte Kopie der anderen Ansicht ist und nicht die gleichen 'Schicht' Eigenschaften eines 'vollen' UIView hat ... – MobileVet

+1

Danke @MobileVet, das ist gut zu wissen. Immer noch frustrierend, dass es keine Möglichkeit gibt, die Pixel von einem Feature zu erhalten, das sich nur um eine schnelle Bildschirmaufnahme dreht ... – carton

+1

Apple bestätigt, dass dies nicht möglich ist. Siehe: http://www.raywenderlich.com/forums/viewtopic.php?f=37&t=8993&start=10 –