Tengo un texto largo proveniente de mi archivo JSON, pero cuando hago clic en el enlace de mi UITableViewCell para ir a mi página UIViewController, el texto UITextView carga el contenido de la cadena pero no muestra el contenido desde el principio y tengo que desplazarme hacia arriba. el tiempo.
¿Lo que necesito hacer?
objective-c
xcode
text
uitextview
Ornilo
fuente
fuente
Respuestas:
Tuve el mismo problema y resultó que tuve que establecer el desplazamiento de contenido en viewDidLayoutSubviews para que surta efecto. Estoy usando este código para mostrar texto estático atribuido.
- (void)viewDidLayoutSubviews { [self.yourTextView setContentOffset:CGPointZero animated:NO]; }
SWIFT 3:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.textView.setContentOffset(CGPoint.zero, animated: false) }
fuente
viewWillLayoutSubviews
: /Esta es la única forma que funcionó para mí. Deshabilito el desplazamiento de UITextView antes de que se cargue la vista y luego lo habilito de nuevo:
override func viewWillAppear(_ animated: Bool) { yourTextView.isScrollEnabled = false } override func viewDidAppear(_ animated: Bool) { yourTextView.isScrollEnabled = true }
fuente
[self.textView scrollRangeToVisible:NSMakeRange(0, 1)];
en
viewDidLoad
fuente
Mediante programación antes de cargar el contenido, deshabilite la propiedad de desplazamiento de textview
textview.scrollenabled = NO;
Y después de cargar, habilite el desplazamiento de la vista de texto
textview.scrollenabled = YES;
Además, verifique
XIB
, siempre no verifique el desplazamiento habilitado de Textview.fuente
Las respuestas a la pregunta El espacio en blanco en la parte superior de UITextView en iOS 10 brindan una experiencia de usuario final mucho más limpia.
En
viewDidLoad
el controlador de vista que contiene la vista de texto:self.automaticallyAdjustsScrollViewInsets = false
La configuración
textView.setContentOffset(CGPointMake(0,0), animated: false)
y algunas de estas otras sugerencias funcionan cuando se llama en el,viewDidLayoutSubviews()
pero en dispositivos más antiguos como iPad 2 y más antiguos, verá que el texto se desplaza cuando se muestra la pantalla. Eso no es algo que desee que vea el usuario final.fuente
Seguía teniendo problemas después de usar estas soluciones. El problema definitivamente parece estar relacionado con tener barras de navegación transparentes y seleccionar ajustar automáticamente las inserciones de contenido en el controlador de vista. Si no le importa que su texto se desplace debajo de la barra de navegación, es mejor dejar esta configuración desactivada y restringir la parte superior de su vista de texto a la parte inferior de la barra de navegación, en lugar de a la parte superior del controlador de vista.
Si, como yo, querías que apareciera debajo de tu barra de navegación cuando te desplazas hacia abajo; entonces la solución que funcionó para mí fue agregar esto.
- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; CGFloat offset = self.navigationController.navigationBar.frame.size.height+[UIApplication sharedApplication].statusBarFrame.size.height; [self.textView setContentOffset:CGPointMake(0, -offset) animated:NO]; }
Esto solo busca la altura de la barra de navegación y la barra de estado y ajusta el desplazamiento de contenido en consecuencia.
Tenga en cuenta que una desventaja de este enfoque es que cuando el dispositivo gira, terminará desplazándose hacia la parte superior.
fuente
Para mí funciona bien este código:
textView.attributedText = newText //or textView.text = ... //this part of code scrolls to top textView.contentOffset.y = -64 //or = 0 if no Navigation Bar textView.scrollEnabled = false textView.layoutIfNeeded() textView.scrollEnabled = true
Para desplazarse a la posición exacta y mostrarlo en la parte superior de la pantalla, uso este código:
var scrollToLocation = 50 //<needed position> textView.contentOffset.y = textView.contentSize.height textView.scrollRangeToVisible(NSRange.init(location: scrollToLocation, length: 1))
La configuración de contentOffset.y se desplaza hasta el final del texto, y luego scrollRangeToVisible se desplaza hasta el valor de scrollToLocation. Por lo tanto, la posición necesaria aparece en la primera línea de scrollView.
fuente
Similar a algunas otras respuestas, pero con el beneficio adicional de que no provocará un desplazamiento hacia arriba en las rotaciones posteriores del dispositivo. Funciona bien en Swift 2.2
/// Whether view has laid out subviews at least once before. var viewDidLayoutSubviewsAtLeastOnce = false override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if !viewDidLayoutSubviewsAtLeastOnce { textView.setContentOffset(CGPoint(x: 0, y: -textView.contentInset.top), animated: false) } viewDidLayoutSubviewsAtLeastOnce = true }
fuente
Versión rápida
Se necesitará una combinación de cosas:
1.) Configura tu salida
@IBOutlet var textView: UITextView!
2.) En el guión gráfico en el controlador de vista, desactive "Ajustar inserciones de vista de desplazamiento"
3.) Establezca el contenido en la parte superior cero agregando a continuación a su controlador de vista
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() myUITextView.setContentOffset(CGPointZero, animated: false) }
fuente
En lugar de configurar el desplazamiento de contenido de viewDidLayoutSubviews , puede escribir layoutIfNeeded desde viewDidLoad para establecer la posición adecuada de textview como se muestra a continuación:
self.textView.layoutIfNeeded() self.textView.setContentOffset(CGPoint.zero, animated: false)
Salud !!
fuente
En Swift 2, la solución Xcode 7, para dejar el desplazamiento habilitado y para que el texto comience en la parte superior, esto es todo lo que necesita:
@IBOutlet weak var myUITextView: UITextView! override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() //start scroll at top of text myUITextView.scrollRangeToVisible(NSMakeRange(0, 0)) }
fuente
Swift 3.0
override func viewWillAppear(_ animated: Bool) { privacyText.isScrollEnabled = false } override func viewDidAppear(_ animated: Bool) { privacyText.isScrollEnabled = true }
fuente
¡Esto funcionó mejor para mí! Coloqué esto dentro de viewDidLoad ().
//TextView Scroll starts from the top myTextView.contentOffset.y = 0
fuente
Aquí hay otra forma de hacerlo que siempre me funciona. C objetivo:
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.textView setContentOffset:CGPointZero animated:NO]; }
Y en Swift:
override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) textView.setContentOffset(CGPointZero, animated: false) }
fuente
Versión rápida:
override func viewDidLayoutSubviews() { yourTextView.setContentOffset(CGPointZero, animated: false) }
fuente
agregue la siguiente función a su clase de controlador de vista ...
Swift 3 override func viewDidLayoutSubviews() { self.mainTextView.setContentOffset(.zero, animated: false) } Swift 2.1 override func viewDidLayoutSubviews() { self.mainTextView.setContentOffset(CGPointZero, animated: false) } Objective C - (void)viewDidLayoutSubviews { [self.mainTextView setContentOffset:CGPointZero animated:NO]; }
或者 你 在 ViewDidAppear 里面 加上 滚动 , 这样 用户 会 看到 他 往上 滚动 到 第一 行
fuente
en swift 4 con texto atribuido, cualquiera de las respuestas no me ayuda y combino algunas respuestas en el tema.
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) uiTextview.isScrollEnabled = false } override func viewDidAppear(_ animated: Bool) { uiTextview.isScrollEnabled = true uiTextview.setContentOffset(CGPoint.zero, animated: false) }
fuente
Solución rápida 3, 4, 5:
Pasos para solucionar el problema:
Código:
yourTextView.isScrollEnabled = false let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1) yourTextView.scrollRectToVisible(rect, animated: false) yourTextView.isScrollEnabled = true
Esto funcionó para mí. ¡Espero que te ayude!
fuente
Así es como lo hice. He subclasificado textview y:
override func willMoveToSuperview(newSuperview: UIView?) { self.scrollEnabled = false } override func layoutSubviews() { super.layoutSubviews() self.scrollEnabled = true }
fuente
Desde el guión gráfico, seleccione el controlador de vista en el que ha colocado la vista de texto. En el inspector de atributos, desactive "Ajustar recuadros de vista de desplazamiento". Eso es.
fuente
Pon este código en tu clase
override func viewDidLayoutSubviews() { self.About_TV.setContentOffset(.zero, animated: false) // About_TV : your text view name) }
fuente
Agregar código a viewdidload
self.automaticallyAdjustsScrollViewInsets = NO;
fuente