2012-07-04 2 views
5

J'ai ce UITextView qui fonctionne bien, sauf que je ne peux pas obtenir le texte à l'intérieur du UITextView pour commencer à défiler seulement après que la taille de UITextView soit presque pleine, L'UITextView a 4 lignes de hauteur, mais dès que j'atteins la 2ème ligne, la 1ère ligne est poussée vers le haut, je ne veux pas que la vue commence à défiler jusqu'à ce que j'aie atteint la ligne 5. scrollingEnabled = NO l'empêche de défiler, ce qui n'a pas fonctionné.Comment faire pour que UITextView ne défile que lorsqu'il est plein de texte

UITextView *barf_ = [[UITextView alloc] initWithFrame:CGRectMake(20.0, 310.0, 155, 50)]; 

barf_.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); 

//[barf_ scrollRangeToVisible:NSMakeRange([barf_.text length], 0)]; 

barf_.layer.cornerRadius = 3.0f; 

barf_.layer.borderWidth = 0.5f; 

barf_.font = [UIFont fontWithName:@"Helvetica" size:13]; 

Répondre

0

Vous pouvez utiliser la méthode sizeWithFont:constrainedToSize:lineBreakMode: pour vérifier si votre chaîne va rendre effectivement plus grand que votre point de vue du texte et voir si vous devez activer le défilement. Vous devrez l'appeler à chaque fois que le texte de votre scrollview est défini.

ex:

CGSize barfStringSize = [barfString sizeWithFont:[barf_ font] 
           constrainedToSize:CGSizeMake(barf_.bounds.size.width, MAXFLOAT) 
            lineBreakMode:UILineBreakModeWordWrap] 
[barf_ setScrollEnabled:barfStringSize.height > barf_.bounds.size.height] 
2

Lorsque votre UITextView est chargé ensemble scrollEnabled NO. Réglez ensuite le délégué de la vue du texte à self ou un autre objet et mettre en œuvre la méthode UITextViewDelegate

- (void)textViewDidChange:(UITextView *)textView 

Cette méthode sera appelé chaque fois que l'utilisateur effectue une modification du texte dans la vue. Dans cette méthode, vous devez déterminer la taille de votre texte et si elle dépasse les limites de la vue de texte. Si c'est le cas, vous activez le défilement. Utilisez cette méthode:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode 

Ceci est une méthode de catégorie UIKit sur NSString. Il retourne un CGSize qui vous indiquera la hauteur de la chaîne de texte sur laquelle vous l'appelez. Dans votre cas, il serait quelque chose comme

CGSize textSize = [textView.text sizeWithFont:textView.font 
          constrainedToSize:CGSizeMake(textView.frame.size.width, MAXFLOAT) 
           lineBreakMode:UILineBreakModeWordWrap]; 
if (textSize.height > textView.frame.size.height) { 
    textView.scrollEnabled = YES; 
} else { 
    textView.scrollEnabled = NO; 
} 
2

J'ai trouvé la réponse, comme d'autres avec des problèmes similaires ont mention, avec une petite textView, il ajoute automatiquement 32 rembourrage au fond.

Une solution simple est d'ajouter YourTextView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); à l'intérieur shouldChangeTextInRange méthode, qui a résolu mon problème!

2

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; 
} 
Questions connexes