2016-10-16 3 views
0

J'ai une tableView avec des cellules statiques à l'intérieur. Une cellule contient une carte, UITextView et d'autres contrôles:Comment puis-je modifier heightForRowAtIndexPath pour qu'il ajuste la hauteur de la textview, mais aussi garder la hauteur minimale quand textview est vide?

enter image description here

Ce textview a les contraintes suivantes:

enter image description here

Jusqu'à présent, je mis en place le heightForRowAtIndexPath à la valeur statique pour cette cellule :

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{ 
    if indexPath.row == 0 { 
     return 311; 
    } 
} 

mais lorsque le texte est plus long, le t extview - au lieu de croître - contient le texte à l'intérieur et l'utilisateur doit le faire défiler. Fondamentalement, il est toujours de 311 en hauteur. Je veux le changer, afin que toute la cellule s'adapte au contenu de textView.

J'ai essayé de changer return 311 à return UITableViewAutomaticDimension, mais ensuite, quand il n'y a pas de texte, la cellule se rétrécit et les contrôles sur la droite ne sont pas visibles. Donc, ma question est - comment puis-je définir la hauteur dynamique de la cellule en fonction du texte à l'intérieur, mais aussi garder la taille minimale de 311?

Répondre

1

automatique. Si vous affichez simplement la texte et ne pas l'éditer en aucune façon. Essayez d'utiliser un UILabel et les UITableViewAutomaticDeminsions fonctionneront comme prévu à condition que les contraintes soient correctement ajoutées.

Ce que vous pouvez faire est d'ajouter une contrainte de hauteur au textView, puis augmenter sa taille en fonction de la taille de la chaîne que vous obtenez. Bien sûr, vous devrez appeler layoutIfNeeded aussi! UITableViewAutomaticDimensions doit prendre en charge le reste.

+0

Vous n'avez pas besoin de modifier manuellement la hauteur de la contrainte. Une étiquette a automatiquement une contrainte de taille intrinsèque à une priorité inférieure (par défaut) qui la rendra aussi haute que nécessaire pour afficher tout le texte. – Jerry

+0

Je voulais dire s'il veut utiliser le textView! Dans ce cas, il devrait changer la hauteur de la contrainte. Un UILabel va se redimensionner tout seul. – Rikh

+0

Ah, oui, j'ai lu ça trop vite, désolé. – Jerry

0

Je ne comprends pas bien votre question, mais d'après ce que vous avez dit peut-être cela fonctionne:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if UITableViewAutomaticDimension > 311 { 
      return UITableViewAutomaticDimension 
    } 
    else { 
     return 311 
    } 
} 

Je vérifie simplement si la cellule doit être plus grand que le minimum de 311, puis retourne soit la minimum ou quelque chose de plus

+0

Je l'ai essayé, mais cela n'a pas fonctionné ... J'ai ajouté 'print (UITableViewAutomaticDimension) 'juste avant l'instruction if et j'obtiens' -1' là, je me demande pourquoi: | – user3766930

+0

C'est étrange, mais dans votre question, vous avez dit que cela fonctionnait, du moins lorsqu'il y avait du texte? – Eric

+0

Peut-être qu'ajouter la réponse de @ Sahil aide, comme il l'a expliqué sous sa question – Eric

1

Ajouter une contrainte de hauteur à la vue du texte> = la valeur minimale (ce qu'il serait lorsque la cellule est 311, puis réglez la hauteur de cellule à

+0

Dans mon cas, la valeur minimale est 95, j'ai ajouté la contrainte 'Height> = 95', mais quand le texte est énorme - cette contrainte reste essentiellement à 95 et la textview à l'intérieur est scrollable. Ce qui est bizarre pour moi, c'est le fait que dans cellForRowAtIndexPath, j'ai désactivé le défilement avec 'cell.textView.scrollEnabled = false', mais il est encore défilable. – user3766930

+0

Est-il vrai que vous n'affichez que le texte?Si c'est le cas, passez à une étiquette et utilisez la contrainte de hauteur. – Jerry

+0

l'étiquette supportera-t-elle plusieurs lignes ici? – user3766930