¿Cómo deshabilitar de forma entrante el desplazamiento de UITextView?

Estoy desarrollando una aplicación de edición de text simple para iPad usando UITextView. Siempre tuve algunos problemas con UIScrollView y UITextView. Creo que esperaba demasiado de estas dos cosas.

Cuando establecí myTextView.text en otra instancia de NSString, se produjo automáticamente el desplazamiento. Podría evitar este desplazamiento configurando

myTextView.scrollEnabled = NO; myTextView.text = newText; myTextView.scrollEnabled = YES; 

Sin embargo, si cambié la propiedad selectedRange de myTextView, se produjo el desplazamiento.

Específicamente, si el range de Rango seleccionado ocurrió en el text en la pantalla actual, el desplazamiento no ocurrió.

Por ejemplo, si selecciono todo el text tocando la propiedad "Seleccionar todo", el desplazamiento no se realizó. Pero si selecciono todo el text estableciendo selectedRange en NSMakeRange (0, [myTextView.text length]), se produjo el desplazamiento hacia el END (la última position del cursor).

Para resolver los problemas, 1) guardé el offset de contenido original de myTextView.

 CGPoint originalOffset = myTextView.contentOffset; // change myTextView.selectedRange here myTextView.selectedRange = originalOffset 

Pero nada sucedió.

2) Llamé a los códigos anteriores después de unos segundos usando NSTimer, y el desplazamiento regresó correctamente a la position original (desplazamiento). Sin embargo, primero se produjo el desplazamiento hasta el final y luego a la parte superior …

¿Hay alguna manera de evitar completamente el desplazamiento de UITextView por un momento?

¡Gracias!

Puede deshabilitar casi todo el desplazamiento colocando el siguiente método en su subclass UITextView:

 - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated { // do nothing } 

La razón por la que digo "casi" todo el desplazamiento es que incluso con lo anterior, todavía acepta los desplazamientos de usuario. Aunque puede deshabilitarlos estableciendo self.scrollEnabled en NO.

Si desea deshabilitar solo algunos desplazamientos, cree un ivar, let us call it acceptScrolls, para determinar si desea permitir el desplazamiento o no. Entonces su método scrollRectToVisible puede verse así:

 - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated { if (self.acceptScrolls) [super scrollRectToVisible: rect animated: animated]; }