6
votes

Make UitextView Parent Soyez sa propre InputAccessoryView

J'essaie d'obtenir une interaction de clavier similaire que les messages contiennent des messages dans iOS 7. J'ai un uiview qui contient un uitexview , et lorsque l'utilisateur le sélectionne à Démarrez la dactylographie, je souhaite faire ce uiview le INPUTACCessoryView . Cela prendrait soin de l'animation pour moi, ainsi que le nouveau Uiscrollview Clavier rejeter l'interaction dans iOS 7.

Lorsque le uitextview commence à éditer, j'essaie de définir son InputAccessoryView à son parent uIView (qui est déjà dans la hiérarchie de vue ). Le clavier apparaît mais pas avec une vue accessoire.

J'ai lu certaines personnes utilisent un duo de Uitextfield S pour faire ce travail, mais cela semble être un mauvais moyen d'y parvenir.

Toute suggestion?


1 commentaires

Ricky: Vous devriez marquer la réponse de PR1001 comme l'acceptée!


3 Réponses :


0
votes

Le seul moyen de faire fonctionner cela est via un deuxième champ de texte. L'idée est de le faire une sous-vision mais pas visible (en raison d'un record fou). Vous changez ensuite de feutre de chauffeur de feu entre et le champ de texte réel pendant que ses méthodes de délégation. J'ai créé un autre projet de test ViewController et cela (vous pouvez copier Coller Coller et vérifier le comportement avec environ 2 minutes): XXX

Je devrais ajouter cette technique dans les applications d'expédition depuis iOS 4.

EDIT: Donc quelques autres idées:

1) Pour faire le pépin lorsque le clavier commence à se déplacer regarder un peu mieux, vous pouvez prendre un instantané de votre TextView, mettez cela dans un UIImageView et lorsque vous supprimez le TextView de la vue principale, remplacez-le par l'UIImageView. Maintenant, l'apparence est la même. Ajoutez une animation pour l'image afin que le notionnel arrive pendant 50 ms, alors l'alpha va à 0. Ajoutez une animation similaire à votre véritable TextView, de sorte qu'il ait un alpha de 0 pour 50 ms, puis cela va à 1. Vous pouvez Soyez capable de le modifier afin que la transition soit bonne (mais pas génère).

2) La façon dont Apple est probablement nécessaire pour obtenir la courbe d'animation et la synchronisation de la notification mobile du clavier. Dans ce cas, ils ajouteraient une vue accessoire avec une hauteur 0 au début et animez le champ de texte pour suivre le suivi du clavier, mais au-dessus de celui-ci. À la fois déplacé la même distance en même temps. À la fin de l'animation, le Textfield est sorti de Self.View, la vue Accessory a été modifiée pour avoir la hauteur du champ de texte et le champ de texte est placé sous forme de sous-vision de la vue du conteneur d'accessoires. Cela devrait fonctionner mais oui, c'est un peu complexe à faire. Si vous voulez que quelqu'un vous codie, vous proposez une bounty de 100 pt. Vous avez toujours besoin du champ de texte factice pour que vous déplaciez le champ de texte à la fin, puisque lorsque vous le sortez de sa vue contenant, il démissionnera le premier répondeur. Donc, à la fin, vous faites le champ factice le premier répondant, déplacez le champ de texte, puis faites le véritable technologie de texte le premier répondeur.


4 commentaires

Merci David. Je vais essayer cela et mettre à jour quand je peux. Dommage que Apple ne fournisse pas une meilleure façon de le faire.


Mon opinion personnelle est que ce n'est pas tellement de code, il utilise des directeurs qui ont souvent été utilisés sur OSX et, franchement, j'ai d'autres bugs et caractéristiques d comme ceux-ci pour travailler. J'ai une vue de collection complexe que je ne peux pas mettre à jour progressivement (il se bloque), donc sur tout changement doit tout recharger!


J'ai réussi à l'obtenir surtout de travailler avec mon UitextViews, mais je remarque que l'uikeyboard s'annonce avec l'InputAccessoryView du bas de l'écran. Donc, très peu de temps, vous pouvez voir une vue sur l'autre. Avez-vous remarqué cela avant?


Je viens de le jeter ensemble et, dans mon test, il semblait très bien dans le simulateur. Je ne sais pas comment vous pouvez voir deux vues - mon code prend le principal et le retire de Self.View, et la fixe comme vue sur l'accessoire. Il manque ce qui manque le passage à la TextView une fois que cela devient le premier répondant.



0
votes

Ceci fonctionne bien mieux si vous n'utilisez pas .InputAccessoryView Tout simplement animer la position du parent uiview car le clavier s'ouvre et se ferme. Voici une réponse décrivant le processus étape par étape avec tout le code.


1 commentaires

Le problème de cette approche est qu'il ne fonctionne pas avec le clavier interactif. Cela ne fonctionne que pour l'aspect / la disparition de clavier régulier.



12
votes

Une solution beaucoup plus facile consiste à apporter votre champ d'entrée la vue d'accessoires d'entrée de votre contrôleur d'affichage: xxx

La vue sera à l'écran en bas de l'écran et quand il devient d'abord Respondateur En réponse à un utilisateur en tapotant, le clavier sera présenté. La vue sera animée de telle sorte qu'il reste immédiatement au-dessus du clavier.


2 commentaires

Wow, j'aimerais pouvoir uppoter cela ~ 20 fois. Je cherchais le meilleur moyen de le faire pour comme une heure. (Certains construisent la TextView et ses autres vues / boutons Tous en code, certains utilisent XIBS, certaines utilisent InputAccessory, certaines utilisent des notifications de clavier), mais ont finalement trouvé cela - définitivement le meilleur moyen! J'ai fait glisser l'UIView (contenant le TextView) que je veux utiliser comme indiqué INPUTACESSORY à la zone de scénario principale ( pas dans la hiérarchie de la vue ViewController), crochue comme une iboutlet et utilisé le code ci-dessus. Cela fonctionne exactement comme prévu, merci! De plus, vous pouvez utiliser le clavier interactif.


Y a-t-il une solution pour l'iPhone X et le périphérique au-dessus de l'encoche en bas? Dans ce cas, il fallait ajouter des embargons de zone de sécurité au bas. Comment peut-on le faire?