UITableView tailles d'en-tĂȘte et de pied de page automatiques avec AutoLayout

image

Dans cet article, je vais essayer de dĂ©couvrir certaines des bizarreries de la classe UITableView et vous montrer les moyens les plus simples et les plus simples d'implĂ©menter des en-tĂȘtes et pieds de page Ă  hauteur variable. Pour moi, la simplicitĂ© est quand il s'agit d'Ă©crire du code d'interface utilisateur, mais ce n'est vraiment pas de coder une interface utilisateur. Dans cet article, je vais tirer le meilleur parti du constructeur d'interface :)
Je vais parler des en-tĂȘtes, mais la mĂȘme chose s'applique aux pieds de page.

image

Configuration de TableView


Les en-tĂȘtes d'un tableau ou d'un style TableView simple ne diffĂšrent d'aucune autre ligne UITableView. La configuration est en fait assez simple.

  • sectionHeaderHeight et sectionHeaderHeight doivent ĂȘtre dĂ©finis.
  • UITableView.automaticDimension permet Ă  AutoLayout de calculer la hauteur de chaque cellule au moment de l'exĂ©cution.
  • estimatedHeaderHeight doit ĂȘtre dĂ©fini pour estimer approximativement la hauteur globale de son contenu afin d'afficher l'indicateur de dĂ©filement.

Ces propriĂ©tĂ©s peuvent ĂȘtre dĂ©finies dans l'inspecteur de taille lorsque vous sĂ©lectionnez TableView dans votre storyboard.

image

CrĂ©ation d'une vue d'en-tĂȘte


tableView(_: viewForHeaderInSection: ) devrait renvoyer une instance UIView, mais devinez quoi? UITableViewCell est une sous-classe d'UIView. Cela signifie que nous pouvons utiliser notre storyboard pour crĂ©er une cellule prototype qui peut ĂȘtre supprimĂ©e et renvoyĂ©e de cette fonction. À mon avis, c'est la meilleure façon de dĂ©clarer toutes vos vues en un seul endroit, au lieu de nombreux fichiers xib dispersĂ©s autour de votre projet.

image

J'ai créé un prototype de cellule qui se compose d'une ImageView à gauche, d'une légende et d'une étiquette de description. Dans ce projet, aucune hauteur statique n'est définie. Nous voulons que la mise en page calcule automatiquement la hauteur de la cellule en fonction de la taille du contenu de l'étiquette, qui sera déterminée lors de l'exécution.

Les étiquettes sont placées dans StackView et sont limitées aux quatre cÎtés de la vue de contenu de cellule. Je préfÚre utiliser StackView lors de la création de vues pour réduire le nombre de restrictions.

image

Pour renvoyer la vue, nous appelons dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell? . Nous n'utilisons pas de variation de la fonction forIndexPath: car nous n'avons pas d'indexPath dĂ©fini pour les lignes d'en-tĂȘte. En outre, forIndexPath: indique qu'un identificateur de rĂ©utilisation est dĂ©fini pour une cellule qui a Ă©tĂ© exclue de la file d'attente pour empĂȘcher le retour de zĂ©ro. Dans notre cas, la section peut ĂȘtre affichĂ©e sans titre.

 guard let headerCell = tableView.dequeueReusableCell(withIdentifier: "header") else { return nil } 

En-tĂȘtes de section vides


Comme prĂ©vu, si l'en-tĂȘte de la section dans la vue de table dans le style du groupe n'est pas dĂ©fini, le cadre affichera une vue vide d'une taille de 30 pixels. Apple a dĂ©cidĂ© qu'il serait Ă©trange que diffĂ©rentes sections en ressemblent. Mais parfois, nous voulons simplement enfreindre les rĂšgles. :)

Pour contourner ce CGFLOAT_MIN , vous pouvez utiliser la constante CGFLOAT_MIN . Il reprĂ©sente la valeur minimale non nĂ©gative pour CGFloat. La valeur est 1,17549435e-38F ou 2,2250738585072014e-308 pour le code 32 bits et 64 bits, respectivement. Au final, ce n'est pas zĂ©ro pixel. D'un autre cĂŽtĂ©, dans une vue de table simple, la hauteur de l'en-tĂȘte peut ĂȘtre dĂ©finie sur n'importe quelle valeur supĂ©rieure ou Ă©gale Ă  0.

Pour ce cas particulier, nous devons utiliser tableView(_:estimatedHeightForHeaderInSection:) tableView(_:heightForHeaderInSection:) tableView(_:estimatedHeightForHeaderInSection:) et tableView(_:heightForHeaderInSection:) . Comme indiquĂ© dans la documentation, deux fonctions doivent ĂȘtre implĂ©mentĂ©es pour dĂ©terminer la hauteur de la vue personnalisĂ©e.

Conclusion


J'ai Ă©tĂ© perplexe de voir autant de hacks sur StackOverflow de personnes voulant implĂ©menter des en-tĂȘtes de diffĂ©rentes hauteurs. C'est une astuce simple que j'utilise constamment lorsque je travaille avec TableView, et j'espĂšre qu'elle vous sera aussi utile qu'elle l'est pour moi. Bon codage! :)

Source: https://habr.com/ru/post/fr448546/


All Articles