2012-02-09 31 views
13

Ho un metodo che aggiunge alcune sottoview (immagini/pulsanti) al mio ScrollView.Il modo migliore per aggiornare/ricaricare UIScrollView

Il fatto è che dall'esterno di ScrollView l'utente può toccare un pulsante che cambierà il contenuto di ScrollView.

C'è un modo decente per "resettare" lo ScrollView meglio:

for (UIView * view in myScrollView.subViews) { 
    [view removeFromSuperview]; 
} 

Si noti che questa soluzione elimina la barra per indicare la posizione sul ScrollView

risposta

19

La chiamata setNeedsDisplay sta per ridisegnare la visualizzazione di scorrimento, non rimuovere effettivamente il contenuto al suo interno.

Come hai scoperto, chiamando removeFromSuperview su tutte le sottoview di visualizzazione a scorrimento causerà talvolta anche la rimozione delle barre di scorrimento (non eccezionale).

Ci sono un paio di approcci attorno a questo: il primo è quello di mantenere un array distinto contenente tutte le viste che hai aggiunto alla vista di scorrimento. È quindi possibile solo scorrere questa matrice invece. A mio avviso, questo è probabilmente l'approccio migliore.

L'altro, un po 'hacky, modo è quello di testare le viste come eseguire iterazioni attraverso di loro:

for (UIView *view in self.contentView.subviews) 
{ 
    if (![view isKindOfClass:[UIImageView class]]) 
     [view removeFromSuperview]; 
} 

Poiché le barre di scorrimento sono a loro volta una sottoclasse UIImageView questo non rimuoverli. Ma poi di nuovo, se stai usando le visualizzazioni di immagini te stesso non verranno rimosse, e non c'è alcuna garanzia nelle future versioni di iOS rimarranno le visualizzazioni di immagini.

Molto meglio andare con il mio primo approccio e mantenere un array con tutte le viste che hai aggiunto.

+0

Sicuramente è un'idea migliore, non ci avevo mai pensato prima ... Per rendere chiaro ad altri con lo stesso problema: Come si aggiunge una sottoview a scrollView, aggiungerla anche a un array. Quando si vede la necessità di rimuoverli, iterare nell'array e semplicemente inviarli removeFromSuperview. –

0

Su rimuovendo eventuali pareri non necessari (che Suppongo che non sarai in grado di aggirare il problema) chiama [myScrollView setNeedsDisplay]; per aggiornare UIScrollView al successivo ciclo di disegno.

+0

e non dimenticare di aggiornare le dimensioni contenuto del UIScrollView chiamando '[myScrollView setContentSize: dimensione];' prima di chiamare '[myScrollView setNeedsDisplay];' o '[myScrollView setNeedsLayout];' –

+2

vedono questo QUINTA domanda: http://stackoverflow.com/questions/2156015/iphone-remove-all-subviews dove si suggerisce di usare '[[sottoview myScrollView] makeObjectsPerformSelector: @selector (removeFromSuperview)];' come modo semplificato di rimuovendo tutte le sottoview. –

+0

* Ho appena realizzato questo: "Si noti che questa soluzione rimuove la barra per indicare la posizione su ScrollView" * ... perché non basta mettere l'UIScrollView all'interno di un UIView, e semplicemente rimuovere UIScrollView e crearne uno nuovo e ripopolare vero? (Se hai intenzione di rimuovere comunque tutte le sottoview) –

2

In genere mantengo una matrice di viste mutevole separata che ho inserito nella vista a scorrimento, e iterare su quella invece di subviews. In questo modo tolgo solo ciò che ho inserito. Ma l'approccio di base è lo stesso.

3

Questa è una specie di un vecchio thread, ma un metodo leggermente più facile potrebbe essere solo per aggiungere un tag per il tuo aggiungendo al UIScrollView, diciamo 15. Poi

for (UIView * view in _scrollView.subviews) { 
    if (view.tag == 15) { 
     [view removeFromSuperview]; 
    } 
} 

questo modo si può essere vista assicurati che solo la vista che hai aggiunto venga rimossa. Solo un pensiero.

1

Ecco cosa ho fatto per rimuovere tutte le sottoview tranne la barra di scorrimento, ho rimosso tutte le sottoview che hanno frame.size.width maggiore di 10, la larghezza della barra di scorrimento è inferiore a 10, quindi non verrà rimossa. Ciò presuppone che tutti i punti di vista che si aggiungono a UIScollView hanno una larghezza maggiore di 10.

for (UIView * view in view.subviews) { 
    if(view.frame.size.width > 10){ // removes all component except scrollbar 
     [view removeFromSuperview]; 
    } 
} 
0

È necessario impostare queste righe prima di metodo start di scorrimento, è sufficiente rimuovere tutti i dati da ScrollView e secondo il vostro metodo di ScrollView sarà reset.

 NSArray* subviews = [[NSArray alloc] initWithArray: Main_Scroll.subviews]; 
     for (UIView* view in subviews) 
     { 
      if ([view isKindOfClass:[UIView class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UIImageView class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UIButton class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UILabel class]]) 
      { 
       [view removeFromSuperview]; 
      } 
     } 
Problemi correlati