La définition du code contentInset
peut aider à l'affichage plus correct du texte dans la zone UITextView
. Cependant, cela ne va pas aider à résoudre le problème par lequel le UITextView
a le défilement activé malgré le fait qu'il n'y ait plus de texte à afficher.
De même, les méthodes telles que sizeWithFont
ont des limitations. Comme expliqué dans l'excellente série de blog de Mike Weller iOS Development: You're Doing It Wrong, NSString
n'est pas un bon objet à demander en ce qui concerne la taille d'un UIView
. Beaucoup de sous-classes UIView
telles que UILabel
, UIButton
, etc. ont des encarts et d'autres considérations qui doivent être prises en compte lors du dimensionnement. UITextLabel
ne fait pas exception.
entrée particulière de Mike Weller à ce sujet est:
You're Doing It Wrong #2: Sizing labels with -[NSString sizeWithFont:...]
iOS 7 nous promet le traitement de texte plus sophistiqué UITextView
, avec des propriétés telles que textContainerInset
. Mais que faire en attendant?
Eh bien, nous savons d'abord que UITextView
est une sous-classe de UIScrollView
.Par conséquent, la règle d'or est que si la propriété contentSize
est plus grande que la propriété bounds
de la vue, la vue déroulante défile afin que nous puissions voir plus de contenu.
Analysant contentSize
agains le bounds
ne fonctionnera pas non plus parce que nous savons que UIScrollView
calcule déjà si elle doit faire défiler ou non en fonction du texte, et il nous donne la mauvaise réponse.
C'est là que les valeurs de réglage arbitraires viennent à la rescousse! Pour moi, cette valeur était 17.f
. Pour vous - en fonction de vos polices - peut-être différent. Nous prenons ensuite le contrôle et décidons si nous devons autoriser la défilement de défilement:
static const CGFloat kArbritaryHeight = 17.f;
CGFloat adjustedContentHeight = myTextView.contentSize.height - kArbritaryHeight;
CGFloat boundsHeight = CGRectGetHeight(myTextView.bounds);
BOOL tooMuchContent = adjustedContentHeight > boundsHeight;
if (tooMuchContent)
{
myTextView.scrollEnabled = YES;
}
else
{
myTextView.scrollEnabled = NO;
}