UITextView commence au bas ou au milieu du texte

Je vais aller droit au but. J’ai un UItextView placé dans ma vue que quand il faut faire défiler pour voir tout le texte (quand beaucoup de texte est présent dans le textView) le textView commence parfois au milieu du texte et le bas du texte d’autres fois.

entrer la description de l'image ici

L’édition n’est pas activée sur textView. J’ai besoin d’un moyen de forcer le textView à démarrer en haut, à chaque fois. J’ai vu quelques questions un peu comme ça où d’autres personnes utilisaient un décalage de contenu, mais je ne sais pas vraiment comment cela fonctionne ou si cela serait même applicable ici.

Merci de votre aide.

Cela a fait le tour pour moi!

Objectif c:

 [self.textView scrollRangeToVisible:NSMakeRange(0, 0)]; 

Rapide:

 self.textView.scrollRangeToVisible(NSMakeRange(0, 0)) 

Swift 2 (solution alternative)

Ajoutez cette méthode de remplacement à votre ViewController

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

Swift 3 & 4 (modification de la syntaxe)

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

Toutes les réponses ci-dessus n’ont pas fonctionné pour moi. Cependant, le secret est d’implémenter votre solution dans une substitution de viewDidLayoutSubviews, comme dans:

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

HTH 🙂

Dans Swift 2

Vous pouvez l’utiliser pour que le textView commence par le haut:

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

Confirmation du travail dans Xcode 7.2 avec Swift 2

Essayez ce code ci-dessous –

 if ( [self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]){ self.automaticallyAdjustsScrollViewInsets = NO; } 

Ou vous pouvez également définir cette propriété par StoryBoard –

Sélectionnez ViewController, puis sélectionnez l’inspecteur d’atsortingbuts maintenant décoché. Adjust Scroll View Insets .

Pour Swift> 2.2, j’ai rencontré des problèmes avec iOS 8 et iOS 9 en utilisant les méthodes ci-dessus, car il n’y a pas de réponse unique, alors voici ce que j’ai fait pour que cela fonctionne pour les deux.

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

Mettez à jour la propriété translucent votre UINavigationBar sur NO :

 self.navigationController.navigationBar.translucent = NO; 

Cela corrigera la vue d’être encadré sous la barre de navigation et la barre d’état.

Si vous devez afficher et masquer la barre de navigation, utilisez le code ci-dessous dans votre viewDidLoad

  if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific 

J’espère que cela t’aides.

Avec beaucoup de tests, j’ai trouvé doit append ci-dessous dans la fonction viewWillLayoutSubviews () pour s’assurer que UITextView apparaît dès le début:

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() textViewTerms.scrollRangeToVisible(NSMakeRange(0, 0)) } 

UITextView défilement UITextView semble poser problème à de nombreuses personnes. À partir des réponses fournies ici (en particulier celle-ci ) et de la documentation du développeur Apple, en utilisant un peu de mon esprit, voici une solution qui fonctionne pour moi. Vous pouvez modifier le code en fonction de vos besoins.

Mon cas d’utilisation est le suivant: le même UITextView est utilisé à des fins différentes, affichant un contenu variable dans différentes circonstances. Ce que je veux, c’est que lorsque le contenu change, l’ancienne position de défilement est restaurée ou, parfois, défilée jusqu’à la fin. Je ne veux pas trop d’animation lorsque cela est fait. Surtout je ne veux pas que la vue s’anime comme tout le texte était nouveau. Cette solution restaure tout d’abord l’ancienne position de défilement sans animation, puis défile jusqu’à la fin de l’animation, si vous le souhaitez.

Ce que vous devez faire (ou dois-je dire peut faire) est d’étendre UITextView comme suit:

 extension UITextView { func setText(text: Ssortingng, 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(NSUTF8SsortingngEncoding) - 1, 0)) }) } }) } } 

Cela met à jour le texte, puis utilise une valeur stockée de la propriété UITextView.contentOffset (ou tout autre élément que vous transmettez en tant que paramètre) et définit le décalage de la vue en conséquence. Si vous le souhaitez, après cela, il fait défiler jusqu’à la fin du nouveau contenu potentiellement modifié.

Je suis nouveau dans la programmation iOS et je ne sais pas pourquoi cela fonctionne si bien que si quelqu’un avait des informations à ce sujet, ce serait bien de le savoir. L’approche n’est peut-être pas parfaite et je suis donc ouvert aux idées d’amélioration.

Et bien sur grâce à NixonsBack pour avoir posté la réponse derrière le lien ci-dessus.

Mon premier post :), bravo!

Xcode 7.2 7c68; IOS 9.1

Mon ViewController qui contient UITextView est compliqué et a beaucoup changé au cours du projet (la version d’IDE a peut-être changé de 2 à 3 fois).

J’ai essayé toutes les solutions ci-dessus, si vous rencontrez le même problème, soyez PATIENT .

Il existe trois «codes secrets» possibles à résoudre:

  1. textView.scrollEnabled = false //then set text textView.scrollEnabled = true
  2. textView.scrollRangeToVisible(NSMakeRange(0, 0))
  3. textView.setContentOffset(CGPointZero, animated: false)

Et il y a deux endroits où vous pouvez mettre ces codes:

  1. viewDidLoad()
  2. viewDidLayoutSubviews()

Combinez-les, vous obtiendrez 3 * 2 = 6 solutions, la combinaison correcte dépend de la complexité de ViewController (Croyez-moi, après avoir supprimé une vue au-dessus de textView , je dois trouver une nouvelle combinaison).

Et j’ai trouvé que:

Lorsque vous mettez ‘codes secrets’ dans viewDidLayoutSubviews() , mais que textView.text = someSsortingngs dans viewDidLoad() , le contenu de textView sera parfois “secoué”. Alors, mettez-les au même endroit.

Dernier mot: essayez TOUTES les combinaisons, c’est comme ça que je résous ce stupide bug plus de trois fois pendant deux mois.

Le code suivant devrait vous donner l’effet souhaité.

 [self.scrollView setContentOffset:CGPointMake(0, -self.scrollView.contentInset.top) animated:YES]; 

Vous devrez remplacer “self.scrollView” par le nom de votre vue de défilement. Vous devez mettre ce code après avoir défini le texte de la vue de défilement.

Mettez cette ligne de code dans ViewDidLoad

 self.automaticallyAdjustsScrollViewInsets = false 

Cela a fonctionné pour moi:

  override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() textView.scrollRectToVisible(CGRect(origin: CGPointZero, size: CGSizeMake(1.0, 1.0)), animated: false) } 

Cela a fonctionné pour moi avec Xcode 8.3.3:

 -(void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [self.txtQuestion scrollRangeToVisible:NSMakeRange(0, 0)]; } 

J’ai traduit la réponse de zeeple à MonoTouch / Xamarin (C #).

 public override void ViewDidLayoutSubviews() { base.ViewDidLayoutSubviews(); myForm.SetContentOffset(new CoreGraphics.CGPoint(0,0), animated: false); } 

Créez un sharepoint vente pour votre UITextView dans le fichier ViewController.swift . Dans la section ViewDidLoad , mettez ce qui suit:

Rapide:

 self.textView.contentOffset.y = 0 

J’ai essayé:

 self.textView.scrollRangeToVisible(NSMakeRange(0, 0)) 

J’ai dû mettre en œuvre deux réponses ici pour que mon sharepoint vue fonctionne comme je le souhaite:

De Juan David Cruz Serrano:

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

Et de Murat Yasar:

 automaticallyAdjustsScrollViewInsets = false 

Cela a donné une UITextView qui charge avec le défilement tout en haut et où les encarts ne sont pas modifiés une fois le défilement lancé. Très étrange que ce ne soit pas le comportement par défaut.

Pour forcer textView à démarrer en haut à chaque fois, utilisez le code suivant:

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

Dans mon cas, je chargeais un textView dans une cellule de table de visualisation personnalisée. Voici ce que j’ai fait pour m’assurer que le texte dans une vue de texte se charge en haut du texte dans ma vue texte dans ma cellule personnalisée.

1.) Dans le storyboard, définissez la textview ScrollEnabled = false en décochant le bouton.

2.) Vous définissez isScrollEnabled sur true dans la vue de texte après le chargement de la vue. Je mets le mien dans un petit délai comme ci-dessous:

 override func awakeFromNib() { super.awakeFromNib() let when = DispatchTime.now() + 1 DispatchQueue.main.asyncAfter(deadline: when){ self.textView.isScrollEnabled = true } } 

Quoi qu’il en soit, si vous êtes dans ma situation ou non, essayez de définir scrollEnabled sur false et, lorsque la vue se charge, définissez scrollEnabled sur true.