iOS 7.1 UITextView toujours pas de défilement du curseur/caret après la nouvelle ligne
Depuis iOS 7, une UITextView
ne défile pas automatiquement le curseur en tant que l'utilisateur tape un texte qui coule à une nouvelle ligne. Ce problème est bien documenté et DONC et d'ailleurs. Pour moi, le problème est toujours présent dans iOS 7.1. Ce que je fais mal?
J'ai installé Xcode 5.1 et ciblée iOS 7.1. Je suis avec Mise en page Automatique.
Voici comment j'ai positionner le texte à l'affichage du contenu au-dessus du clavier:
- (void)keyboardUp:(NSNotification *)notification
{
NSDictionary *info = [notification userInfo];
CGRect keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardRect = [self.view convertRect:keyboardRect fromView:nil];
UIEdgeInsets contentInset = self.textView.contentInset;
contentInset.bottom = keyboardRect.size.height;
self.textView.contentInset = contentInset;
}
Ce que j'ai essayé: j'ai essayé beaucoup de solutions posté DONC, sur cette question comme il se rapporte à iOS 7. Toutes les solutions que j'ai essayé de faire pas semble bien tenir le coup pour le texte de l'affichage d'une attribuées chaîne. Dans les trois étapes suivantes, j'ai décrire la façon dont le plus voté réponse sur SO (https://stackoverflow.com/a/19277383/1239263) répond à l'utilisateur en appuyant sur la touche retour pour la première fois.
(1.) L'affichage de texte est devenu le premier intervenant dans viewDidLoad
. Faites défiler vers le bas de l'affichage de texte à l'emplacement du curseur.
(2.) Avant de saisir un caractère, appuyez sur la touche retour du clavier. L'accent circonflexe disparaît de la vue.
(3.) Appuyant sur la touche de retour encore une fois, cependant, semble pour normaliser la situation. (Remarque: la suppression de la dernière ligne, cependant, fait le signe de disparaître une fois de plus).
- Il convient également de noter que ce parchemin problème est toujours présent dans la Pomme de l'application de Calendrier après la mise à jour iOS 7.1. Créer un nouvel événement, faites défiler jusqu'à la section "Notes", frapper la touche retour jusqu'à ce que le curseur disparaît.
- Vous ne faites rien de mal. C'est un bug.
- Mais il y avait tellement de nombreux rapports de bogues soumis à Apple au sujet de cette question. Peut-être n'étiez pas censé définir la contentInset d'un texte en vue soutenu par le Texte du Kit. Le soi-disant bug disparaît la plupart du temps si je éviter de régler le contentInset.
- Quel est votre point? Cela a bien fonctionné pendant des années et maintenant il ne le fait pas. C'est un bug et Apple n'a pas fixé. J'ai eu beaucoup plus de personnes si vous le souhaitez.
- relax mec, c'est pas comme si j'écrivais une mauvaise critique de votre livre. Je dis seulement qu'Apple ne peut pas voir ce problème comme un bug; peut-être que je ne suis pas à l'aide d'un Kit de Texte soutenu UITextView correctement.
- Plutôt que d'adapter
contentInset
de laUITextView
, définir laframe
deUITextView
& vous problème aura disparu.. Quand claviers montre jusqu'alors de réduire l'image & quand le clavier se cache ensuite ajuster la monture. - J'avais répondu à ma propre question avec une solution similaire (supprimé depuis). Mais elles ne résistent pas à l'épreuve de cas décrites dans les 3 étapes dans mon post (c'est à dire, en appuyant sur la touche retour).
- Découvrez peter steinburgers post, c'est exactement le problème qu'il résout avec une grande explication - petersteinberger.com/blog/2014/fixing-uitextview-on-ios-7
- Le problème est résolu sur iOS 8.
Vous devez vous connecter pour publier un commentaire.
Améliorée de la solution de code pour
UITextView
classe descendante:Noter qu'il ne fonctionne pas lorsque la touche est pressée sur le clavier de Bluetooth.
Une solution robuste devraient se maintenir dans les situations suivantes:
(1.) un texte en vue de l'affichage d'une attribuées chaîne
(2.) création d'une ligne en appuyant sur la touche retour du clavier
(3.) une nouvelle ligne créée en tapant le texte qui déborde à la ligne suivante
(4.) copier et coller du texte
(5.) création d'une ligne en appuyant sur la touche retour pour la première fois (voir les 3 étapes de l'OP)
(6.) dispositif de rotation
(7.) certains cas, je ne peux pas penser que vous...
Pour satisfaire à ces exigences dans iOS 7.1, il semble comme si il est toujours nécessaire de faire défiler manuellement le curseur.
Il est courant de voir les solutions que de les faire défiler manuellement le curseur lors de l'affichage du texte de la méthode du délégué textViewDidChange: est appelé. Cependant, j'ai trouvé que cette technique n'a pas satisfait à la situation n ° 5 ci-dessus. Même un appel à
layoutIfNeeded
avant de vous déplacer à l'accent circonflexe n'a pas aidé. Au lieu de cela, j'ai dû faire défiler le curseur à l'intérieur d'unCATransaction
achèvement bloc:Pourquoi ce travail? Je n'ai aucune idée. Vous devrez demander une Pomme ingénieur.
Pour être complet, voici le code lié à ma solution:
Si vous vous trouvez dans une situation où cela ne fonctionne pas, s'il vous plaît laissez-moi savoir.
Je l'ai résolu par l'obtention de la position actuelle du curseur et de s'adapter à elle, voici ma méthode:
Si vous avez seulement besoin d'orient après que l'utilisateur appuie sur return /enter, essayez:
Laissez-moi savoir si cela fonctionne pour vous!
Je ne trouve pas la source d'origine, mais il fonctionne sur iOS7.1
Certains ont fait une sous-classe qui résout tous scrolling0related questions
UITextView
. La mise en œuvre ne pouvait pas être plus facile - interrupteurUITextView
à la sous-classePSPDFTextView
.Un post à ce sujet, montrant ce qui est fixe (Avec de belles animations Gif) est ici: Fixation UITextView sur iOS 7
Le git est ici: PSPDFTextView