2012-04-03 11 views
5

Ho un problema che non riesco a risolvere. Sto cercando di fare uno screenshot di un UIScrollView (incluso il contenuto fuori schermo) ma quando la vista è lunga il renderingInContext non ottiene tutti i contenuti della vista di scorrimento. Le dimensioni dell'immagine prodotte sono corrette ma i dati renderizzati sembrano essere pezzi mancanti del display lasciando uno spazio bianco dove dovrebbero essere quei pezzi. I blocchi mancanti provengono dal contenuto di un UIWebView, che credo sia impostato su "scaleToFit". Non succede ogni volta, sembra accadere solo quando l'altezza di UIWebView è abbastanza grande. Il che mi fa pensare che abbia a che fare con il ridimensionamento di UIWebView.Come si risolvono i "blocchi" mancanti di dati quando si scattano schermate su un dispositivo iOS?

Se aggiusto il coreLayer.bounds CGRECT qui sotto ottengo risultati diversi, a volte i blocchi mancanti sono in fondo e talvolta si trovano nel mezzo dell'immagine.

Ho iniziato con il codice della risposta accettata di questo question e quando ho notato il problema di taglio, ho modificato al seguente:

UIGraphicsBeginImageContext(scrollView.contentSize); 
{ 
    CGPoint savedContentOffset = scrollView.contentOffset; 
    CGRect savedFrame = scrollView.frame; 


    //hide the scroll bars 
    [scrollView setShowsHorizontalScrollIndicator:NO]; 
    [scrollView setShowsVerticalScrollIndicator:NO]; 


    scrollView.contentOffset = CGPointZero; 
    scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height); 
    //adjust layer for cut-off 
    CALayer *coreLayer = scrollView.layer; 
    coreLayer.bounds = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height); 
    [coreLayer renderInContext: UIGraphicsGetCurrentContext()]; 
    //[scrollView.layer renderInContext: UIGraphicsGetCurrentContext()]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 

    scrollView.contentOffset = savedContentOffset; 
    scrollView.frame = savedFrame; 


    //reset the scroll bars to default 
    [scrollView setShowsHorizontalScrollIndicator:YES]; 
    [scrollView setShowsVerticalScrollIndicator:YES]; 
} 
UIGraphicsEndImageContext(); 

La regolazione di taglio aiutato (fissato con alcuni punti di vista) ma si sta ancora interrompendo quando UIScrollView è abbastanza lungo. Ci sto lavorando da un po 'e non riesco a trovare una soluzione. Hai qualche suggerimento? Qualcuno ha mai riscontrato questo problema?

Si prega di aiuto!

+0

Solo un pensiero, ma hai considerato di modificare temporaneamente scrollView.frame.size per scrollView.contentSize? Ciò richiederà la vista tabella per caricare tutte le celle, dato che si adattano al frame (la tabella visualizza il contenuto della cache al di fuori della cornice, non al di fuori dello schermo). – Kalle

risposta

0

La visualizzazione di scorrimento è una vista tabella? Se è così, praticamente solo il contenuto sullo schermo esiste effettivamente a causa del riutilizzo delle celle. Anche se si tratta di una normale visualizzazione a scorrimento, è plausibile che il sistema operativo stia ottimizzando non rendendo alcuni elementi fuori schermo della vista di scorrimento. Se ciò è vero, potresti riuscire a farlo funzionare scorrendo a livello di programmazione una schermata alla volta e rendendo ognuno di questi nel tuo contesto nella giusta posizione.

+0

Sì, questo è esattamente ciò che sta facendo e ho dovuto capire quanto è effettivamente reso. Quello che ho trovato è che di solito ci sono 3 "blocchi" visibili alla volta. Quindi, mentre scorri UIScrollView, ridisegna il contenuto in base alla direzione dello scorrimento. Quindi sto scattando uno screenshot dell'area a 3 riquadri, scorrendolo fino ai successivi 3 pannelli visualizzabili, ecc. Ecc. – thiesdiggity

+0

Ti raccomando di assicurarti che il tuo codice non contenga il numero 3 con hard-coded. Il numero di righe che vengono disegnate fuori dallo schermo potrebbe essere un dettaglio di implementazione che potrebbe cambiare con una nuova versione del sistema operativo o addirittura essere diverso su un altro dispositivo, a seconda delle capacità disponibili della RAM o della GPU. –

Problemi correlati