Espace vide en haut de UITextView dans iOS 10


116

J'ai UITextView avec du texte dedans. Tout allait bien avec iOS 6, mais maintenant avec iOS 7, il laisse l'espace vide en haut, puis place le texte en dessous du milieu de la vue de texte.entrez la description de l'image ici

Je n'ai défini aucun contentOffSet. Veuillez aider!

Réponses:


217

Une vue de texte est une vue de défilement. Les contrôleurs de vue ajouteront automatiquement un décalage de contenu pour faire défiler les vues, car il est supposé qu'ils voudront défiler derrière la barre de navigation et la barre d'état.

Pour éviter cela, définissez la propriété suivante sur le contrôleur de vue contenant la vue de texte:

self.automaticallyAdjustsScrollViewInsets = NO

7
C'est une meilleure réponse car elle traite non seulement de la manière de corriger le problème, mais aussi de la raison pour laquelle cela se produit en premier lieu.
Stephen Melvin

1
BTW, vous n'avez pas à sous-classer et à remplacer. Définissez simplement automatiquementAdjustsScrollViewInsets sur NO après avoir instancié UITextView.
leftspin

1
@leftspin est un cas assez rare où vous n'avez pas sous-classé un contrôleur de vue. Et le remplacement de la méthode signifie que votre code fonctionnera toujours sur les versions iOS inférieures - la définition de la propriété signifie que vous avez d'abord besoin d'une vérification de compatibilité.
jrturton

1
Donc, si mon contrôleur de vue modèle est en dehors de UINavigationController, le décalage serait effacé? C'est un peu fou ... Ce comportement est UNIQUEMENT correct lorsque ma vue textuelle est alignée vers le haut, sinon c'est de la merde ... Quelqu'un pourrait-il expliquer pourquoi Apple a fait quelque chose comme ça?
Paul Brewczynski

@jrturton excuses pour ce poste plus ancien et veuillez m'excuser car je suis nouveau dans objective-c mais c'est actuellement une propriété de UIViewController ... était-ce une méthode?
Craig

58

La réponse actuelle qu'IronManGill a donnée n'est pas une bonne solution, car elle n'est pas basée sur une compréhension de la raison pour laquelle le problème se produit en premier lieu.

La réponse de jrturton n'est pas non plus le moyen le plus propre de le résoudre. Vous n'avez pas besoin de passer outre. Rester simple!

Tout ce dont vous avez besoin est de définir les paramètres suivants:

self.automaticallyAdjustsScrollViewInsets = NO;

dans la méthode viewDidLoad.

Consultez la documentation: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621372-automaticallyadjustsscrollviewin


1
Faire des changements dans le storyboard est peut-être parfois mieux. Allez dans "Inspecteur d'identité" -> "Attributs d'exécution définis par l'utilisateur" et ajoutez-y une définition.
hufeng03

automaticallyAdjustsScrollViewInsets est obsolète. Depuis iOS11, utilisezcontentInsetAdjustmentBehavior
Cœur

47

Dans le générateur d'interface,

  • Sélectionnez le contrôleur de vue qui contient UITextView.
  • Accédez à l'inspecteur d'attributs.
  • Décochez "Ajuster les inserts de la vue de défilement".

C'est la solution la plus simple pour mon cas dans ios8
platinor

3
Remarque: c'est une propriété de UIViewController. Je n'ai pas pu le trouver et j'ai ensuite réalisé que je n'avais pas lu le texte complètement
Maik639

37

Cela a fonctionné pour moi

textView.textContainerInset = UIEdgeInsetsZero;  
textView.textContainer.lineFragmentPadding = 0;

24

Aller à Interface Builder:

  1. Sélectionnez view controllerqui contient votretext view
  2. décocher la Adjusts Scroll View Insetspropriété

entrez la description de l'image ici


c'était ce que je cherchais. vous pouvez également le faire en ajoutant 'self.automaticallyAdjustsScrollViewInsets = false' à viewController
CodeOverRide

C'est une bonne et directe réponse, qui vient de mettre fin à ma recherche de "pourquoi ce texte n'apparaît-il pas".
UpSampler

10

Je me demande vraiment si c'est une vraie fonctionnalité ... Cet insert automatique de 64 points n'est ajouté que lorsque le UIScrollViewou UITextViewcomme la plus grande profondeur de toutes les sous-vues de la vue du contrôleur de vue. Par exemple, si vous ajoutez une vue derrière (ici je parle de z-buffer, pas d'imbrication de vue) la vue de défilement, cet encart de 64 points n'est pas automatiquement ajouté.

Par exemple, celui-ci ajoute l'encart:

entrez la description de l'image ici

Dans ce cas, l'encart n'est pas ajouté:

entrez la description de l'image ici

Cela me semble vraiment étrange… Pourquoi le système d'exploitation examinerait-il la profondeur de la vue pour décider s'il devrait étendre la vue?



6

Vous pouvez supprimer l'espace vide au-dessus de votre UITextViewen ajoutant:

yourTextView.textContainerInset = UIEdgeInsetsZero;

5

J'ai résolu ce problème en définissant le décalage du contenu sur une valeur négative. Voici le code Swift.

yourTextView.setContentOffset(CGPoint(x: 0, y: -150), animated: true)

C'était la meilleure solution en gardant correctement les inserts et le défilement sous la barre translucide. Je suggérerais cette modification. [self.textView setContentOffset:CGPointMake(0.f, -self.topLayoutGuide.length) animated:NO];
InitJason

1
Rien n'a fonctionné pour moi sauf cela. Swift, Xcode 9.1.
Ashok

1

Ce que vous devez comprendre, c'est que cela concerne la barre de navigation:

  • Si votre contenu passe sous la barre de navigation, vous voulez que le contrôleur de vue ajuste automatiquement les incrustations de la vue de défilement (par défaut).
  • Si votre contenu ne passe pas sous la barre de navigation (vous avez probablement utilisé le guide de mise en page supérieur pour la contrainte d'espace supérieur), vous pouvez désactiver l'ajustement automatique de l'encart de la vue de défilement comme mentionné dans la plupart des autres réponses.

1

J'ai essayé l'astuce suivante, cela a fonctionné.

- (void)viewDidLoad{
   self.textView.scrollEnabled = NO;  
}       
- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   self.textView.scrollEnabled = YES;
}


0

C'est une solution non professionnelle, j'en suis sûr ... Mais le simple fait de mettre une étiquette vierge derrière la vue de texte résout le problème.


1
ce n'est pas une solution =)
Ilker Baltaci

0

Cela a juste fonctionné pour moi (disponible à partir d'iOS 7)

[<#your UITextViewInstance#> setTextContainerInset:UIEdgeInsetsZero];
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.