Il suffit d'appeler UITextView `sizeThatFits:` provoque un comportement de défilement / input glitchy?

Je trouve que dans iOS 8 en utilisant UITextView sizeThatFits: provoque un comportement de défilement glitchy. La vue Texte défile constamment de la ligne sur laquelle vous tapez. Il semble défiler vers le haut de la vue, puis revenir à nouveau.

Si c'est important, la vue est définie comme inputAccessoryView .

Via le keyboard je vais taper: 1 return 2 return 3 return 4

Le TextView le moment avant que je tape 4 :

TextView juste avant le bug

Dans la méthode déléguée, j'appelle sizeThatFits:

 - (void)textViewDidChange:(UITextView *)textView { [textView sizeThatFits:CGSizeMake(100, 100)]; } 

TextView défiler vers le haut. L'input se produit en dessous de la vue. Jittery, glitchy mouvement de défilement vers le haut, puis de return à votre ligne que vous tapez. L'input se produit sous le keyboard. Extrêmement ennuyeux.

typage glitchy

Si je commente la ligne:

 //[textView sizeThatFits:CGSizeMake(100, 100)]; 

Maintenant, quand je tape 4 nous avons une belle frappe sur la dernière ligne:

pas de frappe glitchy

L'UIScrollView sizeThatFits: état des documents:

Cette méthode ne redimensionne pas le récepteur.

Donc, je suis confus pourquoi cela aurait un effet sur le défilement / input du champ de text.

Est-il possible d'éviter ce défilement glitchy?

Comment pouvez-vous calculer la "taille qui correspond" pour une vue de text sans toucher ce bug?

J'ai eu exactement le même problème et il m'a fallu 5 heures pour résoudre ce méchant bug de pomme, je voudrais pouvoir leur envoyer une facture! Ce que je finis par faire était de créer une copy de mon UItextView original:

 self.textViewCopy = [[UITextView alloc] initWithFrame:self.textView.frame]; [self.textViewCopy setFont:self.textView.font]; 

Et ne l'ajoutez pas comme sous-vue.

Ensuite, appelez le sizeThatFits sur la copy (qui va bousiller la copy dont nous ne nous soucions pas et nous obtient les informations dont nous avons besoin):

 [self.textViewCopy setText:self.textView.text]; CGSize size = [self.textViewCopy sizeThatFits:CGSizeMake(fixedWidth, CGFLOAT_MAX)]; 

Utilisation de la méthode NSSsortingng sizeWithFont:constrainedToSize: sur le text dans UITextView semble fournir une alternative performante à sizeThatFits:

 CGSize preferredSize = [textView.text sizeWithFont:textView.font constrainedToSize:CGSizeMake(CGRectGetWidth(textView.bounds), 200.0)]; 

Il est possible que sizeThatFits: utilise sizeWithFont:constrainedToSize: sous le capot. Quoi qu'il en soit, le bug de défilement glitchy iOS n'est pas reproduit lors de l'utilisation de la méthode NSSsortingng.