ios - UITextView comienza en la parte inferior o media del texto
objective-c swift (19)
Para forzar que
textView
comience en la parte superior cada vez, use el siguiente código:
Swift 4.2
:
override func viewDidLayoutSubviews() {
textView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}
Objective-C
:
- (void)viewDidLayoutSubviews {
[self.yourTextView setContentOffset:CGPointZero animated:NO];
}
Me pondré a ello.
Tengo un
UItextView
colocado en mi vista que cuando necesita desplazarse para ver todo el texto (cuando hay mucho texto presente en el textView), el textView comienza en el medio del texto a veces y la parte inferior del texto otras veces.
La edición no está habilitada en textView. Necesito una forma de forzar el textView para comenzar en la parte superior, cada vez. Vi algunas preguntas como esta en las que otras personas usaban un desplazamiento de contenido, pero realmente no sé cómo funciona eso o si incluso sería aplicable aquí.
Gracias por tu ayuda.
Actualice la propiedad
translucent
su UINavigationBar a
NO
:
self.navigationController.navigationBar.translucent = NO;
Esto solucionará que la vista se enmarque debajo de la barra de navegación y la barra de estado.
Si tiene que mostrar y ocultar la barra de navegación, utilice el siguiente código en su
viewDidLoad
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific
Espero que esto ayude.
Con muchas pruebas, encontré que debo agregar a continuación la función viewWillLayoutSubviews () para asegurarme de que UITextView se muestre desde el principio:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
textViewTerms.scrollRangeToVisible(NSMakeRange(0, 0))
}
Cree una salida para su
UITextView
en el archivo
ViewController.swift
.
En la sección
ViewDidLoad
ponga lo siguiente:
Rápido:
self.textView.contentOffset.y = 0
Yo he tratado:
self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
El siguiente código debería darle el efecto que desea.
[self.scrollView setContentOffset:CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
Deberá reemplazar "self.scrollView" con el nombre de su vista de desplazamiento. Debe poner este código después de haber configurado el texto de la vista de desplazamiento.
En mi caso, estaba cargando un textView en una celda de vista de tabla personalizada. A continuación se muestra lo que hice para asegurarme de que el texto en una vista de texto se cargue en la parte superior del texto en mi vista de texto en mi celda personalizada.
1.) En el guión gráfico, configure la vista de texto ScrollEnabled = false desmarcando el botón.
2.) Establece isScrollEnabled en verdadero en la vista de texto después de que se carga la vista. Puse el mío en un pequeño retraso como a continuación:
override func awakeFromNib() {
super.awakeFromNib()
let when = DispatchTime.now() + 1
DispatchQueue.main.asyncAfter(deadline: when){
self.textView.isScrollEnabled = true
}
}
De todos modos, si se encuentra en mi situación o no, intente configurar scrollEnabled en falso y luego, cuando se cargue la vista, configure scrollEnabled en verdadero.
Eso hizo el truco para mí!
C objetivo:
[self.textView scrollRangeToVisible:NSMakeRange(0, 0)];
Rápido:
self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
Swift 2 (solución alternativa)
Agregue este método de anulación a su ViewController
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.setContentOffset(CGPointZero, animated: false)
}
Swift 3 y 4 (edición de sintaxis)
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.contentOffset = .zero
}
Esto funcionó para mí con Xcode 8.3.3:
-(void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
[self.txtQuestion scrollRangeToVisible:NSMakeRange(0, 0)];
}
Esto funcionó para mí:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
textView.scrollRectToVisible(CGRect(origin: CGPointZero, size: CGSizeMake(1.0, 1.0)), animated: false)
}
Para Swift> 2.2, tuve problemas con iOS 8 e iOS 9 al usar los métodos anteriores, ya que no hay una respuesta única que funcione, así que esto es lo que hice para que funcione para ambos.
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if #available(iOS 9.0, *) {
textView.scrollEnabled = false
}
self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if #available(iOS 9.0, *) {
textView.scrollEnabled = true
}
}
Pon esta línea de código en ViewDidLoad
self.automaticallyAdjustsScrollViewInsets = false
Pruebe esto debajo del código -
if ( [self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]){
self.automaticallyAdjustsScrollViewInsets = NO;
}
O también puede configurar esta propiedad por StoryBoard:
Seleccione ViewController y luego seleccione el inspector de atributos ahora desmarcado
Adjust Scroll View Insets
.
Todas las respuestas anteriores no funcionaron para mí. Sin embargo, el secreto resulta ser implementar su solución dentro de una anulación de viewDidLayoutSubviews, como en:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
welcomeText.contentOffset = .zero
}
HTH :)
Traduje la respuesta de zeeple a MonoTouch / Xamarin (C #).
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
myForm.SetContentOffset(new CoreGraphics.CGPoint(0,0), animated: false);
}
Tuve que implementar dos respuestas aquí para que mi punto de vista funcione como quiero:
De Juan David Cruz Serrano:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.setContentOffset(CGPoint.zero, animated: false)
}
Y de Murat Yasar:
automaticallyAdjustsScrollViewInsets = false
Esto dio un UITextView que se carga con el desplazamiento en la parte superior y donde las inserciones no se cambian una vez que comienza el desplazamiento. Muy extraño que este no sea el comportamiento predeterminado.
Xcode 7.2 7c68; IOS 9.1
Mi
ViewController
que contiene
UITextView
es complicado y cambió mucho durante el proyecto (la versión IDE también cambió 2 ~ 3 veces).
He intentado todas las soluciones anteriores, si encuentra el mismo problema, sea PACIENTE .
Hay tres posibles ''códigos secretos'' para resolver:
-
textView.scrollEnabled = false //then set text textView.scrollEnabled = true
-
textView.scrollRangeToVisible(NSMakeRange(0, 0))
-
textView.setContentOffset(CGPointZero, animated: false)
Y hay dos lugares donde puede poner esos códigos:
-
viewDidLoad()
-
viewDidLayoutSubviews()
Combínelos, obtendrá 3 * 2 = 6 soluciones, la combinación correcta depende de cuán complicado sea
ViewController
(Créame, después de eliminar solo una vista sobre
textView
, necesito encontrar una nueva combinación).
Y encontré que:
Cuando se ponen ''códigos secretos'' en
viewDidLayoutSubviews()
, pero
textView.text = someStrings
en
viewDidLoad()
, el contenido en
textView
se ''sacudirá'' a veces.
Entonces, póngalos en el mismo lugar.
Última palabra: pruebe TODAS las combinaciones, así es como resuelvo este estúpido error más de tres veces durante dos meses.
UITextView
desplazamiento de
UITextView
parece ser un problema para mucha gente.
Recopilando las respuestas aquí (especialmente
this
) y la documentación del Desarrollador de Apple, usando algo de mi propio ingenio, aquí hay una solución que funciona para mí.
Puede modificar el código para adaptarlo a sus necesidades.
Mi caso de uso es el siguiente: el mismo
UITextView
se usa para diferentes propósitos, mostrando contenido variado en diferentes circunstancias.
Lo que quiero es que cuando el contenido cambie, la antigua posición de desplazamiento se restablezca o, a veces, se desplace hasta el final.
No quiero demasiada animación cuando esto se hace.
Especialmente no quiero que la vista se anime como si todo el texto fuera nuevo.
Esta solución primero restaura la posición de desplazamiento anterior sin animación, luego se desplaza hasta el final animado, si así lo desea.
Lo que debe hacer (o debería decir que puede hacer) es extender UITextView de la siguiente manera:
extension UITextView {
func setText(text: String, storedOffset: CGPoint, scrollToEnd: Bool) {
self.text = text
let delayInSeconds = 0.001
let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(), {
self.setContentOffset(storedOffset, animated: false)
if scrollToEnd && !text.isEmpty {
let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(), {
self.scrollRangeToVisible(NSMakeRange(text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) - 1, 0))
})
}
})
}
}
Lo que hace es actualizar el texto, luego usa un valor almacenado de la propiedad
UITextView.contentOffset
(o cualquier cosa que pase como parámetro) y establece el desplazamiento de la vista en consecuencia.
Si lo desea, después de esto, se desplaza hasta el final del contenido nuevo y potencialmente modificado.
Soy nuevo en la programación de iOS y no sé por qué funciona tan bien, si alguien tiene información sobre esto, sería bueno saberlo. Además, el enfoque puede no ser perfecto, por lo que también estoy abierto a ideas de mejora.
Y, por supuesto, gracias a NixonsBack por publicar la respuesta detrás del enlace de arriba.
Mi primer post :), ¡salud!
En Swift 2
Puede usar esto para hacer que textView comience desde arriba:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
myTextView.setContentOffset(CGPointZero, animated: false)
}
Confirmado trabajar en Xcode 7.2 con Swift 2
Swift 4.2 y Swift 5
establecer el desplazamiento del contenido antes y después de configurar el texto. (en el hilo principal)
let animation = false //or whatever you want
self.mainTextView.setContentOffset(.zero, animated: animation)
self.mainTextView.attributedText = YOUR_ATTRIBUTED_TEXT
self.mainTextView.setContentOffset(.zero, animated: animation)