Llamar setNeedsDisplay
va a volver a dibujar su vista de desplazamiento, no a eliminar el contenido dentro de ella.
Como has descubierto, llamar al removeFromSuperview
en todas las subvistas de la vista de desplazamiento provocará que algunas veces también se eliminen tus barras de desplazamiento (no muy buenas).
Hay un par de enfoques al respecto: el primero es mantener una matriz distinta que contenga todas las vistas que ha agregado a la vista de desplazamiento. A continuación, puede simplemente iterar a través de esta matriz en su lugar. En mi opinión, este es probablemente el mejor enfoque.
El otro, un poco hacky, forma de hacerlo es poner a prueba los puntos de vista como iterar a través de ellos:
for (UIView *view in self.contentView.subviews)
{
if (![view isKindOfClass:[UIImageView class]])
[view removeFromSuperview];
}
Debido a que las barras de desplazamiento son en sí mismos una subclase UIImageView
esto no va a eliminarlos. Pero, de nuevo, si utiliza las vistas de imágenes usted mismo tampoco se eliminarán, y no hay garantía en futuras versiones de iOS de que seguirán siendo vistas de imágenes.
Mucho mejor para ir con mi primer enfoque y simplemente mantener una matriz con todas las vistas que ha agregado.
De seguro es una idea mejor, nunca se pensó en eso antes ... Para que quede claro para otros con el mismo problema: Al agregar una subvista a su scrollView, también puede agregarla a una matriz. Cuando vea la necesidad de eliminarlos, itere en la matriz y simplemente envíeles un mensaje de removeFromSuperview. –