2013-11-25 20 views
24

snapshotViewAfterScreenUpdates ile oluşturulan bir UIView'dan bir UIImage almak mümkün mü? Bir subview eklendiğindeUIiDen UIiDen snapshot ile oluşturulduViewAfterScreenUpdates:

A UIView snapshotViewAfterScreenUpdates dönen iyi görünüyor, ama şu siyah bir görüntü üretir:

UIImage *snapshotImage = [self imageFromView:someView]; 
:

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

O snapshotViewAfterScreenUpdates dayanmadan görüntü elde etmek elbette mümkündür

Ne yazık ki, karmaşık bir görünüm yakalandığında, drawViewHierarchyInRect, snapshotViewAfterScreenUpdates hızıyla eşleşemez. snapshotViewAfterScreenUpdates tarafından oluşturulan bir görünümden UIImage almak için daha hızlı olacağını umuyordum, bu mümkün mü?

cevap

20

cevabı dolaylı olarak bu onaylar HAYIR gibi görünüyor ve Apple'ın documentation:

Eğer bir anlık görüntüye, bulanıklık gibi bir grafik efekti, uygulamak istiyorsanız, drawViewHierarchyInRect:afterScreenUpdates: yöntemi yerine kullanılacak.

O WWDC13 en hızlı yöntemi olarak snapshotViewAfterScreenUpdates listeler, ancak örnek kodda drawViewHierarchyInRect kullanır dan iOS oturumda üzerinde ilgi çekici UI uygulama olduğunu belirtmek gerekir.

+2

Bunun işe yaramamasının nedeni, anlık görüntü tarafından döndürülen görünümün aslında tam bir görünüm değil. Hata ayıklayıcısını adım adım atarsanız, bunun türünün '_UIReplicantView' olduğunu görürsünüz. Bu sadece diğer görünümün optimize edilmiş bir kopyası olduğunu ve 'tam' bir UIView ... – MobileVet

+1

teşekkürler @MobileVet'in aynı 'katman' özelliklerine sahip olmadığını düşünmemi sağlıyor, bunu bilmek güzel. Hâlâ hayal kırıklığı yaratan bir özellik, tüm bu hızlı ekran görüntüsü hakkında bir özellikten piksel elde etmenin bir yolu yok ... – carton

+1

Apple bunun mümkün olmadığını doğruladı. Bakınız: http://www.raywenderlich.com/forums/viewtopic.php?f=37&t=8993&start=10 –

İlgili konular