Le contenu textuel de UITextView ne commence pas par le haut

J’ai un long texte provenant de mon fichier JSON, mais lorsque je clique sur le lien de mon UITableViewCell pour accéder à ma page UIViewController, le texte UITextView charge le contenu de la chaîne, mais il ne montre pas le contenu depuis le début. le temps.

Ce que je dois faire?

J’ai eu le même problème et j’ai dû définir le décalage de contenu dans viewDidLayoutSubviews pour qu’il prenne effet. J’utilise ce code pour afficher le texte statique atsortingbué.

- (void)viewDidLayoutSubviews { [self.yourTextView setContentOffset:CGPointZero animated:NO]; } 

SWIFT 3:

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.textView.setContentOffset(CGPoint.zero, animated: false) } 

C’est la seule façon qui a fonctionné pour moi. Je désactive le défilement de UITextView avant que la vue ne soit chargée et puis je l’activer à nouveau:

  override func viewWillAppear(_ animated: Bool) { yourTextView.isScrollEnabled = false } override func viewDidAppear(_ animated: Bool) { yourTextView.isScrollEnabled = true } 
 [self.textView scrollRangeToVisible:NSMakeRange(0, 1)]; 

dans viewDidLoad

Par programme avant de charger le contenu, désactivez la propriété de défilement de textview textview.scrollenabled = NO;

Et après le chargement, activez le défilement de textview textview.scrollenabled = YES;

Vérifiez également le XIB , toujours ne pas vérifier le défilement activé de Textview.

Les réponses à la question Espace vide en haut de UITextView dans iOS 10 offre une expérience utilisateur plus nette .

Dans viewDidLoad du contrôleur de vue contenant la vue texte:

  self.automaticallyAdjustsScrollViewInsets = false 

textView.setContentOffset(CGPointMake(0,0), animated: false) et que certaines de ces suggestions fonctionnent dans les viewDidLayoutSubviews() vous verrez que le texte défilera lorsque l’écran est affiché. Ce n’est pas quelque chose que l’utilisateur final doit voir.

J’avais encore des problèmes après avoir utilisé ces solutions. Le problème semble définitivement lié à la présence de barres de navigation transparentes et à la sélection permettant d’ajuster automatiquement les encarts de contenu sur le contrôleur de vue. Si vous ne vous souciez pas de votre texte défilant sous la barre de navigation, il est préférable de laisser ces parameters désactivés et de limiter le haut de votre vue au bas de la barre de navigation, plutôt qu’au sumt du visualiseur.

Si, comme moi, vous vouliez qu’il apparaisse sous votre barre de navigation lorsque vous faites défiler la liste; alors la solution qui a fonctionné pour moi était d’append ceci.

 - (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]; } 

Cela ne fait que rechercher la hauteur de la barre de navigation et de la barre d’état et ajuste le décalage du contenu en conséquence.

Notez que l’un des inconvénients de cette approche est que lorsque l’appareil tourne, vous finirez par revenir en haut.

Pour moi fonctionne bien ce code:

  textView.atsortingbutedText = 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 

Pour faire défiler jusqu’à la position exacte et l’afficher en haut de l’écran, j’utilise ce code:

  var scrollToLocation = 50 // textView.contentOffset.y = textView.contentSize.height textView.scrollRangeToVisible(NSRange.init(location: scrollToLocation, length: 1)) 

La définition de contentOffset.y défile jusqu’à la fin du texte, puis scrollRangeToVisible défile jusqu’à la valeur de scrollToLocation. Ainsi, la position requirejse apparaît en première ligne de scrollView.

Semblable à d’autres réponses, mais avec l’avantage supplémentaire de ne pas provoquer un défilement vers le haut sur les rotations de périphérique suivantes. Fonctionne bien dans 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 } 

Version rapide

Une combinaison de choses sera nécessaire:

1.) Définissez votre prise

  @IBOutlet var textView: UITextView! 

2.) Dans le storyboard sur View Controller, désactivez “Ajuster les encarts d’affichage du défilement”

3.) Mettre le contenu à zéro en ajoutant ci-dessous à votre contrôleur de vue

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() myUITextView.setContentOffset(CGPointZero, animated: false) } 

Dans Swift 2, solution Xcode 7, pour laisser défiler Enabled et afficher le texte en haut, c’est tout ce dont vous avez besoin:

 @IBOutlet weak var myUITextView: UITextView! override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() //start scroll at top of text myUITextView.scrollRangeToVisible(NSMakeRange(0, 0)) } 

Swift 3.0

 override func viewWillAppear(_ animated: Bool) { privacyText.isScrollEnabled = false } override func viewDidAppear(_ animated: Bool) { privacyText.isScrollEnabled = true } 

Voici une autre façon de le faire qui fonctionne toujours pour moi. Objectif c:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.textView setContentOffset:CGPointZero animated:NO]; } 

Et à Swift:

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) textView.setContentOffset(CGPointZero, animated: false) } 

Version rapide:

 override func viewDidLayoutSubviews() { yourTextView.setContentOffset(CGPointZero, animated: false) } 

Étapes à suivre

  • Désactiver la vue de défilement UITextView
  • définir scrollRectToVisible Enable
  • Défilement UITextView

Swift 3:

 self.yourTextView.isScrollEnabled = false let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1) self.yourTextView.scrollRectToVisible(rect, animated: false) self.yourTextView.isScrollEnabled = true 

Cela a fonctionné pour moi.

Cela a fonctionné le mieux pour moi! Je l’ai placé dans viewDidLoad ().

 //TextView Scroll starts from the top myTextView.contentOffset.y = 0 

Ajoutez la fonction suivante à votre classe de contrôleur de vue …

 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 里面 加上 滚动 , 这样 用户 行 行 行

C’est comme ça que je l’ai fait. J’ai sous-classé textview et:

 override func willMoveToSuperview(newSuperview: UIView?) { self.scrollEnabled = false } override func layoutSubviews() { super.layoutSubviews() self.scrollEnabled = true } 

Dans le storyboard, sélectionnez le contrôleur de vue sur lequel vous avez placé la vue texte. Dans l’inspecteur d’atsortingbuts, désélectionnez “Ajuster les encarts de la vue de défilement”. C’est tout.

en swift 4 avec texte atsortingbué, toute réponse ne m’aide pas et je combine des réponses dans le sujet.

 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) } 

Au lieu de définir le décalage de contenu à partir de viewDidLayoutSubviews, vous pouvez écrire layoutIfNeeded à partir de viewDidLoad pour définir la position correcte de textview comme ci-dessous:

  self.textView.layoutIfNeeded() self.textView.setContentOffset(CGPoint.zero, animated: false) 

À votre santé !!

Mettez ce code sur votre classe

 override func viewDidLayoutSubviews() { self.About_TV.setContentOffset(.zero, animated: false) // About_TV : your text view name) } 

Ajouter du code au viewdidload

 self.automaticallyAdjustsScrollViewInsets = NO;