UITextView cursor below frame lors du changement de cadre
J'ai un UIViewCOntroller
qui contient un UITextView
. Lorsque le clavier apparaît, je le redimensionner comme ceci:
#pragma mark - Responding to keyboard events
- (void)keyboardDidShow:(NSNotification *)notification
{
NSDictionary* info = [notification userInfo];
CGRect keyboardSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect newTextViewFrame = self.textView.frame;
newTextViewFrame.size.height -= keyboardSize.size.height + 70;
self.textView.frame = newTextViewFrame;
self.textView.backgroundColor = [UIColor yellowColor];
}
- (void)keyboardWillHide:(NSNotification *)notification
{
NSDictionary* info = [notification userInfo];
CGRect keyboardSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect newTextViewFrame = self.textView.frame;
newTextViewFrame.size.height += keyboardSize.size.height - 70;
self.textView.frame = newTextViewFrame;
}
Le textView semble rezise à la bonne taille, mais lorsque l'utilisateur tape le curseur se termine "à l'extérieur" du textView cadre. Voir l'image ci-dessous:
La zone jaune est la UITextView
image (je ne sais pas ce que la ligne bleue à côté de la touche R est). Je trouve cela assez filaire. Je suis sous iOS7 si cela fait une différence.
Des idées ou des conseils?
Mise à jour
J'ai un UITextView sous-classe qui dessine des lignes horizontales avec la méthode suivante (si cela fait une différence):
- (void)drawRect:(CGRect)rect {
//Get the current drawing context
CGContextRef context = UIGraphicsGetCurrentContext();
//Set the line color and width
CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:229.0/255.0 green:244.0/255.0 blue:255.0/255.0 alpha:1].CGColor);
CGContextSetLineWidth(context, 1.0f);
//Start a new Path
CGContextBeginPath(context);
//Find the number of lines in our textView + add a bit more height to draw lines in the empty part of the view
NSUInteger numberOfLines = (self.contentSize.height + rect.size.height) / self.font.lineHeight;
CGFloat baselineOffset = 6.0f;
//iterate over numberOfLines and draw each line
for (int x = 0; x < numberOfLines; x++) {
//0.5f offset lines up line with pixel boundary
CGContextMoveToPoint(context, rect.origin.x, self.font.lineHeight*x + 0.5f + baselineOffset);
CGContextAddLineToPoint(context, rect.size.width, self.font.lineHeight*x + 0.5f + baselineOffset);
}
//Close our Path and Stroke (draw) it
CGContextClosePath(context);
CGContextStrokePath(context);
}
source d'informationauteur Anders
Vous devez vous connecter pour publier un commentaire.
Au lieu de redimensionnement de l'image, pourquoi ne pas donner à votre texte en vue d'une
contentInset
(et un correspondant descrollIndicatorInsets
)? Rappelez-vous que le texte vues sont réellement scrollviews. Ce est la bonne façon de gérer le clavier (ou d'autres) des interférences.Pour plus d'informations sur
contentInset
voir cette question.Ce qui semble ne pas être suffisant. Toujours utiliser des encarts, ce qui est plus correct (surtout sur iOS7, où le clavier est transparent), mais vous aurez également besoin de manipulation supplémentaire pour le signe:
Beaucoup de travail, Apple devrait fournir une meilleure façon de gérer le signe, mais cela fonctionne.
Tous les autres réponses, j'ai essayé s'est comporté un peu étrange pour moi. À l'aide d'un
NSTimer
pour effectuer le défilement signifiait aussi que l'utilisateur ne pouvait pas faites défiler vers le haut, depuis le signe serait ensuite se retrouver hors de l'écran et il serait immédiatement faites défiler vers le bas de nouveau. En fin de compte, je suis bloqué avec l'approche originale de l'évolution de laUITextView
cadre sur le clavier de notification, puis ajouter les méthodes suivantes:Fonctionne comme un charme pour moi
Beaucoup de réponses déjà, j'ai trouvé que dans mon cas, c'est effectivement beaucoup plus simple. Sur keyboardWillShow - je régler l'affichage de texte du
contentInset
et de garder l'image en plein écran. Et tandis quescrollRangeToVisible:
ne fonctionne pas pour moi comme pour beaucoup d'autres, le défilement méthodes de vue (à partir de laquelle UITextView hérite) fonctionnent tout aussi bien. Cela fonctionne pour moi:Anders et Leo Natan ont d'excellentes solutions. Cependant, j'ai dû modifier leurs réponses un peu pour obtenir le défilement fonctionne correctement avec contentInset. Le problème que j'ai été confrontés était que
textViewDidBeginEditing:
est appelée avantkeyboardWasShown:
de sorte que le contentInset changement ne se reflètent la première fois. Voici ce que j'ai fait:.h
.m
C'est ce que j'ai fait, et quelque chose qui semble fonctionner:
Une solution simple à ce problème est de mettre à jour l'affichage du texte de la trame en réponse à la textViewDidBegingEditing délégué de la méthode. Pour plus de détails, voir:
Comment ré-taille UITextView lorsque le clavier affiché avec iOS 7
Pour ceux qui ont un
UITextView
à l'intérieur d'unUIScrollView
où iOS < 7 a pris soin de déplacer le curseur dans la vue: Voici comment cela fonctionne avec iOS 7 (et également 5 & 6).J'ai essayé d'inclure la plupart des colle le code. Les seules choses qui manquent de la définition de la UITextView du délégué et rejetant le clavier.
A pris 2-3 jours pour comprendre ce qui fonctionnait auparavant. Merci, Apple.
Ange Naydenov du commentaire ci-dessus est juste, surtout dans des cas tels que le passage de l'anglais au Japonais clavier qui montre suggère.
Lors de la commutation de claviers,
UIKeyboardWillShowNotification
est appelée, maisUIKeyboardWillHideNotification
n'est pas appelé.Vous devez ajuster le médaillon à l'utilisation de la valeur absolue et de ne pas utiliser
+=
.Unrelatedly,
[self.textView setContentOffset:newOffset animated:YES];
ne sera pas réellement changer les graphismes dans iOS 7.1 après le clavier est affiché pour la deuxième fois, ce qui est probablement un bug. Une solution de contournement que j'ai utilisé est de remplaceravec
Leo Natan, vous avez bien commencé, mais l'exécution a été relativement inefficace. Ici est la meilleure façon de le faire avec moins de code: