Comment faire un UITableViewCell avec un UITextView à l'intérieur, qui ajustent dynamiquement sa hauteur, sur la base de la UITextView?
Je voudrais avoir un tablew vue avec un comportement similaire à l'iPhone l'application de Contacts par Apple: un uitableviewcell avec un uitextview l'intérieur, de sorte que quand j'écris dans le uitextview, le uitextview augmente sa hauteur, et donc en conséquence l'uitableviewcell s'ajuste de façon dynamique sa hauteur. J'ai cherché sur le web, trouver seuls des solutions partielles et de l'absence de l'exemple de code!
s'il vous plaît aider moi je suis désespérée
Tony
Vous devez vous connecter pour publier un commentaire.
En regardant cela,vous devez être un peu délicat. Vous avez besoin de calculer la hauteur de la textView et de manière dynamique en fonction de la Hauteur de la TextView,vous avez besoin de revenir à la Hauteur de la cellule..
Il est très facile & un peu Délicat..
C'est le code qui vous permet de calculer la taille de la chaîne....
D'abord obtenir la taille de la Chaîne
Deuxièmement, de créer dynamiquement le textView dans la cellule..donner la stringSize.hauteur
Après avoir donné beaucoup de peine pour mes doigts,......Je pense que c'est assez de code...& va sûrement vous aider à résoudre le problème..
Bonne Chance
[tableView beginUpdates]
, que vous pouvez appeler à partir de laUITextView
délégué méthodetextViewDidChange:
), il sera en fait complète de votre réponse (réunion du demandeur exigences). La combinaison est ce que finalement résolu le problème j'ai eu (comme Tony mais pour un en-tête de section avec unUITextView
au lieu d'unUITableViewCell
).UILineBreakModeWordWrap
a été déprécié. Pour iOS6+, vous devez utiliserNSLineBreakByWordWrapping
Créer un personnalisé UITableViewCell et ajouter votre UITextView de la cellule contentView.
Dans LayoutSubviews, ensemble textView.cadre à la cellule contentView.limites (ou faire une autre mise en page personnalisée).
Lorsque le textView de la modification de contenu (découvert via UITextViewDelegate), de faire deux choses:
1) appel
[tableView beginUpdates]; [tableView endUpdates];
Cela va forcer l'affichage de la table de recalculer la hauteur pour toutes les cellules (appelleratableView:heightForRowAtIndexPath:
). Si votre portable est le délégué pour le textView, alors vous aurez à comprendre comment obtenir un pointeur vers la tableView, mais il existe quelques moyens pour y parvenir. Ou vous pourriez faire le délégué de votre vue-contrôleur...2) lorsque
tableView:heightForRowAtIndexPath:
est appelé pour cette cellule, le retour de latextView.contentSize.height
. Vous pouvez obtenir votre téléphone portable à partir d'ici, en appelant[tableView cellForRowAtIndexPath];
Ou si vous avez juste une de ces cellules, puis cache un pointeur dans votre viewController.Le seul problème que j'ai trouvé avec l'acceptées réponse est que nous sommes attribution de la UITextView à chaque fois. J'ai trouvé que cela soulevait des problèmes avec la saisie dans la vue et d'avoir le texte de la mise à jour immédiatement et aussi garder la vue en tant que premier répondant. Quand j'ai essayé de recharger la cellule avec la nouvelle hauteur, il serait alors essayez d'ajouter un nouveau textView.
À cause de ce que j'ai trouvé une méthode légèrement différente pour atteindre le même but. Nous espérons que cette prise différente pourrait aider les gens qui ont de la difficulté à mettre en œuvre le code ci-dessus.
1) Dans le fichier d'en-tête de définir une variable pour la hauteur du texte et le textView:
Définition d'une variable signifie que nous pouvons nous charger de la vue à une certaine hauteur, si nous sommes le chargement du texte dans le textView et réduit également la complexité.
2) Charger le texte de la vue et de l'ajouter à notre cellule
À l'aide de keeplayout nous a permis de garder notre textfield pour toujours rester à la même hauteur que la cellule. Nous sommes également à seulement jamais l'ajout de notre UITextView une fois.
3) Ajouter le code pour calculer la hauteur du texte
J'ai essayé beaucoup et trouvé que c'était le meilleur
4) Ajoutez un peu de logique dans la hauteur de la cellule de rendre l'utilisation de ce:
Évident, nous avons besoin d'un peu plus de hauteur que notre texte de hauteur, alors j'ai ajouté un coussin supplémentaire montant qui peut être expérimenté.
5) Actualiser l'affichage à chaque fois qu'un caractère est tapé pour vérifier si nous avons besoin d'augmenter la taille:
Dans cette section, nous obtenons la hauteur du texte à chaque fois que l'utilisateur tape.
Alors si nous utilisons notre valeur stockée et de comparer la valeur actuelle de la valeur stockée. Évidemment, si ils sont le même, alors il n'y a pas de point dans l'actualisation de la vue. Si ils sont différents de nous mettre à jour la valeur, puis actualiser notre table.
Ce peu, j'ai trouvé une bonne réponse sur stackOverflow montrant comment nous pouvons actualiser uniquement les hauteurs de la table au lieu de la cellule elle-même. Pourquoi actualiser la cellule lorsque nous n'avons pas besoin? Cela signifie qu'une fois que cela s'appelle la hauteur de la cellule est mise à jour et il augmente bien.
De toute façon j'ai trouvé que ça fonctionnait très bien et était assez simple qui peut être mis en place ou ont les différentes parties et de les mettre dans d'autres peuples morceaux de code.
Accessoires pour la accepté de répondre à ce qui a été pillé pour diverses pièces le long du chemin, mais j'espère aussi que cela permet de répondre à certaines personnes qui ont les mêmes difficultés que j'ai eu.
J'ai écrit mes apprentissages et la solution pour le calcul de la UITableViewCell hauteur basé sur un intérieur UITextView sur mon blog. Le message contient le code qui fonctionne pour les applications universelles, à la fois la vue de la table des styles et de l'autorotation.
Enfin je l'ai eu à travailler. Le principal problème est de savoir comment obtenir de la cellule
contentView
largeur correcte. Codé en dur largeur ne fonctionne pas pour tous les cas, car il peut varier en conséquence de la plaine/groupés tableau de style, les accessoires ajoutés, ou paysage/portrait. La seule façon d'obtenir 100% de bonne largeur est de lui demander de la cellule de l'objet. J'ai donc créer des cellules droit dansheightForRowAtIndexPath
et de le stocker dans le cache, puis cette mise en cache de la cellule sera retourné par lacellForRowAtIndexPath
méthode.Un autre problème est de savoir comment la force de la cellule à la disposition de ses sous-vues avant de l'utiliser. Il peut être fait si nous temporaires ajouter des cellules de la
tableView
et mise à jour de la cellule de trame avectabelView
's largeur. Après que tous les sous-vues sera relooké dans le droit chemin. Ici est de savoir comment je l'ai eu à travailler dans mon TableKit bibliothèque.- Je modifier TomSwift réponse qui est la meilleure façon de le faire :
voici ma cellule code (swift)
pour l'explication, la cellule d'affichage de tableau est un faible, les propriétés de la cellule, donc je peux le dire à la mise à jour de mise en page lorsque l'utilisateur d'entrer du texte.
La hauteur de la cellule est la somme de ses principales contraintes liées à l'contentView, son fond de contrainte à la contentView et le textView.contantSize.la hauteur, qui est aussi égal à la textView hauteur constante
Vous avez besoin de revenir à la bonne hauteur dans le heightForRowAtIndexPath méthode du délégué.
Essayez le code suivant:
vous pouvez obtenir le UITextView taille de la programmation.Selon la taille,la hauteur de la cellule en utilisant le délégué suivant
Les gars c'est vraiment des trucs cool, mais vous pouvez utiliser tableview:didSelectRowForIndexPath: ajouter l'UITextView à la cellule comme il est sous-vue lorsque l'utilisateur appuie sur elle, fonctionne très bien puisque vous devez utiliser seulement 1 UITextView que vous pouvez réutiliser et n'interfère pas avec le tableview la réception touche! Relâchez lorsque vous avez terminé.
Détails? il suffit de demander!