2014-09-16 8 views
5

Sto tentando di scattare un'istantanea di una vista nascosta ma sto riscontrando diversi problemi. Se provo a rimuoverlo rapidamente, scattare un'istantanea e quindi a reinserirla, a volte ho un rapido sfarfallio sullo schermo che è piuttosto fastidioso.Scatta un'istantanea di un UIView nascosto

toCollectionViewCell.hidden = NO; 
UIView *toPlaceHolderSnapshot = [toCollectionViewCell resizableSnapshotViewFromRect:toCollectionViewCell.bounds afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero]; 
toCollectionViewCell.hidden = YES; 

Sono abbastanza sicuro che il tremolio è causato dai afterScreenUpdates: SI, ma non riesco a immaginare che è destinato comportamento.

Ho anche provato a spostare la cella/vista sullo schermo invece di nasconderlo, ma non posso essere certo quando quella cella potrebbe essere ricaricata e quindi spostata di nuovo al suo posto prematuramente.

C'è un modo per scattare un'istantanea di una vista nascosta o un modo più intelligente per raggiungere questo obiettivo? Ho bisogno di questa funzionalità durante un'animazione di transizione personalizzata in cui sto estraendo una cella della vista di raccolta dalla vista di raccolta e quindi la rimando al suo posto in seguito. Sto scattando le istantanee dello stato prima/dopo e poi la transizione tra i due durante l'animazione.

Grazie!

risposta

5

Aggiungi una vista contenitore aggiuntiva alla gerarchia della vista. Nascondere il contenitore avrà lo stesso effetto visivo, ma sarai in grado di eseguire istantaneamente il snapshot del contenuto di un contenitore.

+0

bella soluzione! molto elegante e semplice – trdavidson

+1

Ho provato a farlo ma tutto quello che ho ottenuto è stato uno schermo nero .. – jonypz

+0

anche per me non funziona – christijk

0

Ho anche provato spostando schermo cella/visualizzare off invece di nasconderlo, ma non può essere certi che quando cella potrebbe essere ricaricata e quindi trasferito al suo posto prematuramente.

Questo approccio è probabilmente il più semplice. Finché tutto il tuo lavoro è fatto sul thread principale, la cella non si muoverà durante la tua istantanea.


Si potrebbe anche provare l'archiviazione e poi unarchiving la vista (per sostanza, copiarlo):

id copyOfView = 
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]]; 
UIView *viewCopy = (UIView *)copyOfView; 
viewCopy.hidden = NO; 

(Tutte le viste nella gerarchia dovranno conformarsi al protocollo NSCoding.)


Infine, è possibile disegnare la cella su un UIImage e quindi visualizzarlo in un UIImageView. Sample code here.