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.
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. –