Existe-t-il un moyen d'ajouter un espacement entre les deux UITableViewCell
?
J'ai créé un tableau et chaque cellule ne contient qu'une image. L'image est affectée à la cellule comme ceci:
cell.imageView.image = [myImages objectAtIndex:indexPath.row];
mais cela rend l'image agrandie et rentre dans la cellule entière, et il n'y a pas d'espacement entre les images.
Ou disons de cette manière, la hauteur de l'image est par exemple de 50, et je veux ajouter 20 espacement entre les images. Y a-t-il un moyen d'accomplir cela?
ios
objective-c
uitableview
Saili
la source
la source
Réponses:
Version Swift
Mis à jour pour Swift 3
Cette réponse est un peu plus générale que la question initiale pour le bien des futurs téléspectateurs. Il s'agit d'un exemple supplémentaire à l'exemple de base UITableView pour Swift .
Aperçu
L'idée de base est de créer une nouvelle section (plutôt qu'une nouvelle ligne) pour chaque élément du tableau. Les sections peuvent ensuite être espacées en utilisant la hauteur de l'en-tête de section.
Comment faire
Configurez votre projet comme décrit dans l' exemple UITableView pour Swift . (Autrement dit, ajoutez un
UITableView
et connectez latableView
prise au contrôleur de vue).Dans le générateur d'interface, modifiez la couleur d'arrière-plan de la vue principale en bleu clair et la
UITableView
couleur d'arrière - plan en clair.Remplacez le code ViewController.swift par ce qui suit.
ViewController.swift
Notez que cela
indexPath.section
est utilisé plutôt queindexPath.row
pour obtenir les valeurs appropriées pour les éléments du tableau et les positions de prise.Comment avez-vous obtenu le rembourrage / l'espace supplémentaire à droite et à gauche?
Je l'ai obtenu de la même manière que vous ajoutez un espacement à n'importe quelle vue. J'ai utilisé des contraintes de mise en page automatique. Utilisez simplement l' outil d'épingle dans Interface Builder pour ajouter un espacement pour les contraintes de début et de fin.
la source
numberOfSectionsInTableView
etreturn 1
pour le nombre de lignes. Utilisez ensuiteindexPath.section
pour obtenir l'index de cellule actuel. Essayez-le une fois. Je pense que vous découvrirez que vous n'avez pas besoin de faire beaucoup de changements à votre configuration actuelle. C'est certainement plus facile que de sous-classer.layer
manipulations étaient assez rapides. Êtes-vous en train de dire cela parce que vous avez remarqué une mauvaise performance ou comme une bonne pratique générale? Même si vous les définissez dans un XIB, ils doivent toujours être définis lorsque la cellule est créée.Ma solution simple avec Swift :
Résultat
la source
super.layoutSubviews()
abord pour m'assurer que la vue entière était correctement présentée avant de définir son cadre.didSet
pourselected
variable et appel à l'layoutSubviews()
intérieur!La façon dont j'arrive à ajouter un espacement entre les cellules est de faire numberOfSections = "Your array count" et de faire en sorte que chaque section ne contienne qu'une seule ligne. Et puis définissez headerView et sa hauteur.
la source
J'avais besoin de faire le même concept que les UITableCells aient un "espace" entre elles. Puisque vous ne pouvez pas littéralement ajouter d'espace entre les cellules, vous pouvez le simuler en manipulant la hauteur de cellule de UITableView, puis en ajoutant un UIView au contentView de votre cellule. Voici une capture d'écran d'un prototype que j'ai fait dans un autre projet de test lorsque je simulais ceci:
Voici un peu de code (Remarque: il y a beaucoup de valeurs codées en dur à des fins de démonstration)
Tout d'abord, je devais régler le
heightForRowAtIndexPath
pour permettre différentes hauteurs sur l'UITableViewCell.Ensuite, je veux manipuler l'aspect et la convivialité des UITableViewCells, donc je le fais dans la
willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
méthode.Notez que j'ai fait ma hauteur whiteRoundedCornerView 70,0 et c'est ce qui cause l'espace simulé car la hauteur de la cellule est en fait 80,0 mais mon contentView est 70,0 ce qui lui donne l'apparence.
Il y a peut-être d'autres façons d'accomplir cela encore mieux, mais c'est juste comment j'ai trouvé comment le faire. J'espère que cela peut aider quelqu'un d'autre.
la source
Vous devrez définir le cadre de votre image. Le code non testé est
la source
layoutSubviews
si vous faites une sousUITableViewCell
UITableViewCell
afin d'obtenir le résultat dont j'ai besoin :) ... Le sousUITableViewCell
- classement est très courant.UITableViewCell
. Lorsque vous créez une personnalisation,UITableViewCells
vous devez effectuer des sous-classesUITableViewCell
.J'étais dans le même bateau. Au début, j'ai essayé de passer aux sections, mais dans mon cas, cela a fini par être plus un casse-tête que je ne le pensais au départ, alors j'ai cherché une alternative. À continuer à utiliser des lignes (et ne pas gâcher la façon dont vous accédez à vos données de modèle), voici ce qui a fonctionné pour moi simplement en utilisant un masque :
Tout ce que vous avez à faire est d'agrandir la hauteur de la cellule de la même valeur que celle souhaitée
verticalPadding
, puis de modifier votre disposition intérieure de sorte que toutes les vues qui avaient un espacement vers les bords de la cellule aient ce même espacement augmenté deverticalPadding/2
. Inconvénient mineur: vous obtenez unverticalPadding/2
rembourrage en haut et en bas de la tableView, mais vous pouvez rapidement résoudre ce problème en définissanttableView.contentInset.bottom = -verticalPadding/2
ettableView.contentInset.top = -verticalPadding/2
. J'espère que cela aide quelqu'un!la source
Je pense que la solution la plus simple si vous recherchez simplement un peu d'espace et probablement la moins chère serait de simplement définir la couleur de la bordure de la cellule sur la couleur d'arrière-plan de votre tableau, puis de définir la largeur de la bordure pour obtenir le résultat souhaité!
la source
Si vous n'utilisez pas déjà des en-têtes de section (ou des pieds de page), vous pouvez les utiliser pour ajouter un espacement arbitraire aux cellules du tableau. Au lieu d'avoir une section avec n lignes, créez un tableau avec n sections avec une ligne chacune.
Implémentez la
tableView:heightForHeaderInSection:
méthode pour contrôler l'espacement.Vous voudrez peut-être également implémenter
tableView:viewForHeaderInSection:
pour contrôler à quoi ressemble l'espacement.la source
Je l'ai résolu de cette façon dans Swift 4.
Je crée une extension de UITableViewCell et j'inclus ce code:
J'espère que ça t'aide.
la source
Exemple dans swift 3 ..
le code du contrôleur de vue est ci-dessous comme
func numberOfSections (dans tableView: UITableView) -> Int {return arraytable.count}
Télécharger la source complète sur Github: lien
https://github.com/enamul95/CustomSectionTable
la source
Trois approches auxquelles je peux penser:
Créez une cellule de tableau personnalisée qui présente la vue de la cellule entière de la manière que vous souhaitez
Au lieu d'ajouter l'image à la vue d'image, effacez les sous-vues de la vue d'image, créez une vue personnalisée qui ajoute une UIImageView pour l'image et une autre vue, peut-être une simple UIView qui fournit l'espacement souhaité, et ajoutez-la en tant que sous-vue de la vue de l'image.
Cela a-t-il du sens?
la source
Oui, vous pouvez augmenter ou réduire l'espacement (remplissage) entre deux cellules en créant une vue de base sur la vue de contenu dans la cellule.Définissez une couleur claire pour l'arrière-plan de la vue de contenu et vous pouvez ajuster la hauteur de la vue de base pour créer un espace entre les cellules.
la source
Basé sur la réponse de Husam: l'utilisation de la couche de cellule au lieu de la vue de contenu permet d'ajouter une bordure autour de la cellule entière et de l'accessoire si nécessaire. Cette méthode nécessite un ajustement soigneux des contraintes de fond de la cellule ainsi que de ces encarts sinon la vue ne sera pas correcte.
la source
Changer le nombre de lignes dans la section à 1 Vous avez changé le nombre de sections au lieu du nombre de lignes
Ici, vous mettez l'espacement entre les lignes
la source
Je pense que c'est la solution la plus propre:
la source
layoutMargins
cette méthode. Peut-être parce que j'utilise la mise en page automatique.Cet article a aidé, c'est à peu près ce que les autres réponses ont dit mais résumant et concis
https://medium.com/@andersongusmao/left-and-right-margins-on-uitableviewcell-595f0ba5f5e6
Dans celui-ci, il ne les applique qu'aux côtés gauche et droit, mais l'
UIEdgeInsetsMake
init permet d'ajouter un rembourrage aux quatre points.Notez que UIEdgeInsets peut également être utilisé pour réaliser la même chose.
Xcode 9.3 / Swift 4
la source
Il n'est pas nécessaire d'utiliser un tas de sections différentes. Les autres réponses utilisent des encarts de cadre et CGRect et des couches et ... BLAH. Pas bon; utilisez la disposition automatique et un UITableViewCell personnalisé. Dans cet UITableViewCell, au lieu de sous-afficher votre contenu dans le contentView, créez un nouveau containerView (un UIView), sous-visualisez la vue du conteneur dans le contentView, puis sous-visualisez toutes vos vues dans la vue du conteneur.
Pour créer l'espacement maintenant, modifiez simplement les marges de mise en page de la vue du conteneur, comme ceci:
la source
Essayez de regarder dans - (UIEdgeInsets) layoutMargins; sur la cellule
la source
Ma situation était que j'utilisais UIView personnalisé pour viewForHeader dans la section également heightForHeader dans la section retourner une hauteur constante, disons 40, le problème était quand il n'y avait pas de données, toutes les vues d'en-tête étaient touchées les unes aux autres. donc je voulais espacer entre la section en l'absence de données, donc j'ai fixé en changeant simplement le plan "style tableview" en "Groupe". et cela a fonctionné pour moi.
la source
Découvrez ma solution sur GitHub avec sous-classification
UITableView
et utilisation des fonctionnalités d'exécution d'Objective-C.Il utilise essentiellement la structure de données privée d'Apple
UITableViewRowData
que j'ai obtenue en recherchant l'en-tête d'exécution privé deUITableView
:https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableView.h ,
et voici la classe privée souhaitée qui contient tout ce dont vous avez besoin pour disposer les espacements de vos cellules comme vous le souhaitez sans le définir dans les classes de cellules:
https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableViewRowData.h
la source
J'avais du mal à faire fonctionner cela avec les couleurs d'arrière-plan et les vues d'accessoires dans la cellule. J'ai fini par devoir:
1) Définissez la propriété de vue d'arrière-plan des cellules avec un UIView défini avec une couleur d'arrière-plan.
2) Repositionnez cette vue dans layoutSubviews pour ajouter l'idée d'espacement
la source
Utiliser les en-têtes comme espacement fonctionnerait bien, je suppose que si vous ne voulez pas utiliser d'en-têtes. Sinon, probablement pas la meilleure idée. Ce que je pense, c'est créer une vue de cellule personnalisée.
Exemples:
Dans la cellule personnalisée, créez une vue d'arrière-plan avec des contraintes afin qu'elle ne remplisse pas toute la cellule, donnez-lui un peu de remplissage.
Ensuite, rendez l'arrière-plan de tableview invisible et supprimez les séparateurs:
la source
Si vous ne souhaitez pas modifier la section et le numéro de ligne de votre vue de tableau (comme je l'ai fait), voici ce que vous faites:
1) Ajoutez une ImageView au bas de votre vue de cellule de tableau.
2) Faites-lui la même couleur que la couleur d'arrière-plan de la vue de table.
J'ai fait cela dans mon application et cela fonctionne parfaitement. À votre santé! :RÉ
la source
SWift-5, espacement entre UITableViewCell
la source
Vous pouvez simplement utiliser une contrainte dans le code comme ceci:
il est important d'ajouter une sous-vue (conteneur) et d'y mettre d'autres éléments.
la source
ajoutez une vue intérieure à la cellule puis ajoutez-y vos propres vues.
la source
Solution Swift 5.0
Dans la sous-classe UITableViewCell
la source
Utilisez UITableViewDelegate
heightForRowAtIndexPath
et renvoyez la hauteur de la ligne.la source