J'ai un problème étrange UITableView
uniquement avec iOS 7.
UITableViewCellSeparator
disparaît au-dessus de la première ligne et en dessous de la dernière ligne. Parfois, après avoir sélectionné les lignes ou certaines actions de défilement, il apparaît.
Dans mon cas , tableView
est chargé de la Storyboard
avec UITableViewStylePlain
style. Le problème n'est sûrement pas dans UITableViewCellSeparatorStyle
, ce qui n'est pas changé par défaut UITableViewCellSeparatorStyleSingleLine
.
Comme je l'ai lu sur les forums Apple Dev ( ici et ici ), d'autres personnes ont un tel problème et certaines solutions de contournement sont trouvées, par exemple:
Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.
Mais je suis toujours à la recherche de la raison d'un tel comportement étrange de séparateur.
Des idées?
Mise à jour: comme je l'ai vu dans XCode 5.1 DP et iOS 7.1 beta, Apple a essayé de résoudre ce problème. Maintenant, le séparateur est affiché selon les besoins, parfois sous la dernière ligne, après un rafraîchissement, mais pas après la création de la tableview.
Réponses:
J'ai vidé la hiérarchie des sous-vues des cellules affectées et j'ai constaté que le
_UITableViewCellSeparatorView
paramètre était défini sur masqué. Pas étonnant que ce ne soit pas montré!J'ai remplacé
layoutSubviews
dans maUITableViewCell
sous-classe et maintenant les séparateurs sont affichés de manière fiable:Objectif-C :
Swift :
Les autres solutions proposées ici n'ont pas fonctionné de manière cohérente pour moi ou semblent maladroites (ajout de vues de pied de page personnalisées de 1 px).
la source
Cela a fonctionné pour moi:
la source
J'ai aussi eu le problème avec séparateur manquant et j'ai découvert que le problème est survenu seulement quand
heightForRowAtIndexPath
a été le retour d' un nombre décimal . Solution:la source
Avez-vous essayé d'ajouter un UIView de hauteur 1 dans l'en-tête et le pied de page du tableau avec une couleur de fond gris clair? En gros, cela se moquera du premier et du dernier séparateur.
la source
@samvermette
J'ai résolu le problème en utilisant ces méthodes de délégué. Maintenant, il ne clignote pas:
la source
Nous avons rencontré ce problème dans notre application. Lorsque l'utilisateur a sélectionné une cellule, une nouvelle vue de table a été poussée sur la pile du contrôleur de navigation, puis lorsque l'utilisateur l'a sautée, le séparateur était manquant. Nous l'avons résolu en mettant
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
dans ladidSelectRowAtIndexPath
méthode de délégué de vue table.la source
self.tableView.allowsMultipleSelection = NO;
?Voici une solution de contournement plus simple (bien qu'un peu compliquée) si vous en avez besoin, essayez de sélectionner et de désélectionner la cellule une fois les données rechargées et l'animation par défaut terminée.
il suffit d'ajouter:
la source
J'ai trouvé que la solution la plus simple est, après le rechargement d'une cellule, de recharger également la cellule ci-dessus:
la source
Une solution simple et propre qui fonctionne à la fois sur iOS 8 et iOS 9 (bêta 1)
Voici une solution de contournement simple, propre et non intrusive. Il s'agit d'appeler une méthode de catégorie qui corrigera les séparateurs.
Tout ce que vous avez à faire est de parcourir la hiérarchie de la cellule et de décocher le séparateur. Comme ça:
Ce que je recommande est d'ajouter ceci à une catégorie sur UITableViewCell, comme ceci:
Étant donné que le séparateur peut disparaître dans une cellule différente de celle actuellement sélectionnée, il est probablement judicieux d'appeler ce correctif sur toutes les cellules de la vue tableau. Pour cela, vous pouvez ajouter une catégorie à UITableView qui ressemble à ceci:
Avec cela en place, vous pouvez appeler
-fixSeparatos
votre tableView juste après l'action qui les fait disparaître. Dans mon cas, c'était après avoir appelé[tableView beginUpdates]
et[tableView endUpdates]
.Comme je l'ai dit au début, j'ai testé cela sur iOS 8 et iOS 9. Je suppose que cela fonctionnera même sur iOS 7, mais je n'ai aucun moyen de l'essayer là-bas. Comme vous le savez probablement, cela manipule les éléments internes de la cellule afin qu'elle puisse cesser de fonctionner dans une version ultérieure. Et Apple pourrait théoriquement (0,001% de chance) rejeter votre application à cause de cela, mais je ne vois pas comment ils pourraient même découvrir ce que vous faites là-bas (vérifier le suffixe d'une classe ne peut pas être détecté par les analyseurs statiques comme quelque chose mauvais, OMI).
la source
Basé sur le commentaire de @ ortwin-gentz, cette solution fonctionne pour moi dans iOS 9.
(Code rapide)
J'utilise la fonction fixCellsSeparator () après avoir appelé endUpdates () dans certaines méthodes de ma tableView, par exemple:
J'espère que cette solution sera utile pour quelqu'un!
la source
Complément à la réponse de airpaulg.
Donc, fondamentalement, il faut implémenter deux méthodes UITableDelegate. Voici ma solution qui fonctionne à la fois sur iOS7 et iOS6.
// Cela masquera la grille de tableau vide sous les cellules si elles ne couvrent pas tout l'écran
la source
Cela a résolu le problème pour moi:
Assurez-vous que la valeur
clipsToBounds
est OUI pour la cellule, mais NON pour la cellulecontentView
. Définir égalementcell.contentView.backgroundColor = [UIColor clearColor];
la source
On dirait que ce problème se manifeste dans de nombreuses circonstances.
Pour moi, cela avait quelque chose à voir avec la sélection des cellules. Je ne sais pas pourquoi et je n'ai pas eu le temps de creuser trop profondément, mais je peux dire que cela a commencé à se produire lorsque j'ai mis la cellule
selectionStyle
à zéro. c'est à dire:J'ai essayé d'utiliser certaines des méthodes de délégué ci-dessus qui activent et désactivent le
separatorStyle
propriété du,tableView
mais elles ne semblent rien faire pour résoudre mon problème.La raison pour laquelle j'en avais besoin était parce que je n'avais même pas besoin de sélection de cellule.
Donc, j'ai trouvé quelque chose qui a fonctionné pour moi. Je viens de désactiver la sélection sur
UITableView
:J'espère que cela aide quelqu'un, si vous n'avez pas besoin de sélectionner une cellule.
la source
J'ai essayé tant de suggestions pour corriger mais je ne peux pas résoudre ce problème.Enfin, j'ai décidé de personnaliser la ligne de séparation comme ci-dessous:
P / S: personnalisé à willDisplayCell NOT cellForRowAtIndexPath
la source
De manière assez surprenante, changer la
separatorInset
valeur de la cellule dans les deux sens semble fonctionner:la source
J'ai également eu le problème de cet affichage de ligne de séparation incohérent au bas de mon UITableView. En utilisant une vue de pied de page personnalisée, j'ai pu créer une ligne similaire et l'afficher au-dessus de celle existante potentielle (qui manquait parfois).
Le seul problème de cette solution est qu'Apple peut changer un jour l'épaisseur du trait
la source
J'ai résolu de mettre ces lignes de code là où la mise à jour de la tableview se produit:
Par exemple, dans mon cas, je les ai mis ici:
la source
Vous devez supprimer une sélection de cellule avant de procéder à la mise à jour de la cellule. Ensuite, vous pouvez restaurer la sélection.
la source
Pour résoudre le problème ci-dessus, ajoutez un pied de page vide dans viewDidLoad.
Veuillez ne pas utiliser les lignes ci-dessus dans la méthode déléguée viewForFooterInSection. Signifie Ne pas implémenter la méthode viewForFooterInSection.
la source
pour développer la réponse airpaulg, car cela n'a pas entièrement fonctionné pour moi ..
j'ai dû également implémenter la méthode heightforfooter pour obtenir la hauteur
puis j'ai remarqué que la couleur gris clair est trop sombre. J'ai corrigé cela en saisissant la couleur de séparation actuelle de la vue de la table et en l'utilisant:
UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];
la source
J'ai également rencontré ce problème dans notre projet. Ma vue de table avait une tableFooterView qui pourrait y arriver. J'ai trouvé que le séparateur sous la dernière ligne apparaîtrait si je supprimais cette tableFooterView.
la source
Ce qui a fait la différence pour moi a été de recharger la ligne pour laquelle la ligne de séparation du bas n'apparaît pas:
la source
Je résous ce problème d'une autre manière: ajoutez un calque dont la hauteur est de 0,5 px et sa couleur est gris clair dans tableview.tableFooterView comme sous-calque.
le code est juste comme ça:
la source
Dans votre UITableViewCell, implémentez layoutSubviews et ajoutez:
la source
Comme quelqu'un l'a mentionné, ce problème semble se manifester de diverses manières. J'ai résolu mon problème via la solution de contournement suivante:
la source
En parcourant les réponses et les solutions, j'ai trouvé de telles observations:
Cela semble être problématique dans iOS 7 et 8. J'ai remarqué le problème lors de la sélection de la cellule à partir du code dans
viewDidLoad
méthode:1) La solution de contournement le faisait
viewDidAppear:
si quelqu'un ne se soucie pas du délai notable entre la présentation de la vue et la sélection de la cellule2) la deuxième solution a fonctionné pour moi mais le code semble un peu fragile car il repose sur l'implémentation interne du
UITableViewCell
3) l'ajout de son propre séparateur semble être le plus flexible et le meilleur pour le moment, mais nécessite plus de codage :)
la source
Définir le style a
viewWillAppear
fonctionné pour moi.la source
Comme il s'agit toujours d'un problème avec IOS 8, j'ajouterai ma solution dans Swift. Définissez la ligne de séparation tableview sur aucun. Ajoutez ensuite ce code à la méthode de délégué cellForRowAtIndexPath. Cela ajoutera un joli séparateur. L'instruction if permet de décider quelles cellules doivent avoir un séparateur.
la source
Voici ma solution à ce problème. Après avoir inséré votre (vos) cellule (s), rechargez la section. Si le rechargement de la section entière est trop intensif pour vous, rechargez simplement les indexPaths ci-dessus et ci-dessous.
la source
rencontré un problème similaire, j'ai trouvé qu'une autre bonne solution, surtout si votre dataSource n'est pas volumineuse, est de recharger la tableData lorsque vous implémentez la
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
méthode, voici un exemple:Vous pouvez également simplement recharger des données non visibles en fonction de la source de données visible, mais cela nécessite un peu plus de piratage.
Gardez à l'esprit que cette fonction de délégué relève du
UITableViewDelegate
protocole!J'espère que ça aide!
la source