J'ai une application où l' UITableView
encart de séparation du est défini sur des valeurs personnalisées - Droite 0
, Gauche 0
. Cela fonctionne parfaitement dans iOS 7.x
, mais iOS 8.0
je vois que l'encart de séparation est défini sur la valeur par défaut de 15
droite. Même si dans les fichiers xib sur lesquels il est défini 0
, il s'affiche toujours de manière incorrecte.
Comment supprimer les UITableViewCell
marges du séparateur?
ios
objective-c
swift
uitableview
ios8
user3570727
la source
la source
[UIColor clearColor]
et de dessiner vos propres séparateurs. Vous êtes beaucoup plus flexible de cette façon.UITableViewCellSeparatorStyle
défauts. Même la réponse acceptée est un hack vraiment sale à mon avis.Réponses:
iOS 8.0 introduit la propriété layoutMargins sur les cellules ET les vues de tableau.
Cette propriété n'est pas disponible sur iOS 7.0, vous devez donc vérifier avant de l'attribuer!
La solution simple consiste à sous-classer votre cellule et à remplacer la propriété des marges de disposition, comme suggéré par @ user3570727. Cependant, vous perdrez tout comportement du système comme l'héritage des marges de la zone sûre, donc je ne recommande pas la solution ci-dessous:
(Objectif c)
(rapide 4.2):
Si vous ne souhaitez pas remplacer la propriété ou devez la définir de manière conditionnelle, continuez à lire.
En plus de la
layoutMargins
propriété, Apple a ajouté une propriété à votre cellule qui l'empêchera d'hériter des paramètres de marge de votre vue tabulaire. Lorsque cette propriété est définie, vos cellules sont autorisées à configurer leurs propres marges indépendamment de la vue de table. Considérez-le comme une dérogation.Cette propriété est appelée
preservesSuperviewLayoutMargins
et sa définitionNO
permettra aulayoutMargin
paramètre de la cellule de remplacer tout ce quilayoutMargin
est défini sur votre TableView. Il permet à la fois de gagner du temps ( vous n'avez pas à modifier les paramètres de la vue Table ) et est plus concis. Veuillez vous référer à la réponse de Mike Abdullah pour une explication détaillée.REMARQUE: ce qui suit est une implémentation propre pour un paramètre de marge au niveau de la cellule , comme exprimé dans la réponse de Mike Abdullah. La définition de vos cellules
preservesSuperviewLayoutMargins=NO
garantit que votre vue de table ne remplace pas les paramètres de la cellule. Si vous souhaitez réellement que l'ensemble de votre vue de table ait des marges cohérentes, veuillez ajuster votre code en conséquence.Configurez vos marges de cellule:
Swift 4:
La définition de la
preservesSuperviewLayoutMargins
propriété NO sur votre cellule devrait empêcher votre vue de table de remplacer vos marges de cellule. Dans certains cas, il semble ne pas fonctionner correctement.Si tout échoue, vous pouvez forcer brutalement vos marges d'affichage de table:
Swift 4:
... et c'est parti! Cela devrait fonctionner sur iOS 7 et 8.
EDIT: Mohamed Saleh attiré mon attention sur un éventuel changement dans iOS 9. Vous devrez peut - être régler le Tableau de
cellLayoutMarginsFollowReadableWidth
laNO
si vous souhaitez personnaliser ou marges des encarts. Votre kilométrage peut varier, cela n'est pas très bien documenté.Cette propriété n'existe que dans iOS 9, assurez-vous donc de vérifier avant de définir.
Swift 4:
(le code ci-dessus à partir du séparateur UITableView iOS 8 ne fonctionne pas )
EDIT: Voici une pure approche Interface Builder:
REMARQUE: iOS 11 modifie et simplifie une grande partie de ce comportement, une mise à jour sera à venir ...
la source
cell.preservesSuperviewLayoutMargins = NO
la suggestion de @ bffmike ou après avoir fait défiler les façons dont les encarts apparaîtront. (wtf ??)cell.preservesSuperviewLayoutMargins
dans ma méthode de source de données:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Arg !!! Après avoir joué, soit en faisant cela dans votre
Cell
sous-classe:ou en le
cell.layoutMargins = UIEdgeInsetsZero;
fixant pour moi.la source
separatorInset
IB n'a pas fonctionné. il y a aussi un problème avec les couleurs d'arrière-plan de la vue tableau. ce sont des trucs vraiment malades.Prenons un moment pour comprendre le problème avant de charger aveuglément pour tenter de le résoudre.
Un rapide coup d'œil dans le débogueur vous dira que les lignes de séparation sont des sous-vues de
UITableViewCell
. Il semble que la cellule elle-même assume une bonne part de responsabilité pour la disposition de ces lignes.iOS 8 introduit le concept de marges de mise en page . Par défaut, les marges de présentation d'une vue sont
8pt
de tous les côtés et héritées des vues ancêtres.Autant que nous puissions le dire, lors de la disposition de sa ligne de séparation,
UITableViewCell
choisit de respecter la marge de disposition de gauche, en l'utilisant pour contraindre l'encart gauche.En mettant tout cela ensemble, pour atteindre l'encart souhaité de zéro, nous devons:
0
En d'autres termes, c'est une tâche assez simple à réaliser:
A noter:
preservesSuperviewLayoutMargins
si vous le souhaitez.preservesSuperviewLayoutMargins
, vous pouvez configurer des vues d'ancêtre (telles que la table) pour qu'elles aient également0
laissé une marge, mais cela semble intrinsèquement plus sujet aux erreurs car vous ne contrôlez pas toute cette hiérarchie.0
et de laisser les autres être.UITableView
dessine au bas des tables de style simples, je suppose que cela nécessitera de spécifier les mêmes paramètres au niveau de la table aussi (je n'ai pas essayé celui-ci!)la source
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
layoutMargins
etpreservesSuperviewLayoutMargins
sur la cellule est tout ce qui est nécessaire. Tout le reste ressemble à faire confiance au vaudou.separatorInset
d'unUITableViewCell
dans iOS 8, vous devez définir la valeurUIEdgeInsets
zéro sur leUITableView
et leUITableViewCell
. Si vous ne faites pas les deux, vous aurez toujours un encart gauche supérieur à zéro. Je l'ai confirmé plusieurs fois.Je crois que c'est la même question que j'ai posée ici: Supprimer SeparatorInset sur iOS 8 UITableView pour XCode 6 iPhone Simulator
Dans iOS 8 , il existe une nouvelle propriété pour tous les objets hérités
UIView
. Ainsi, la solution pour définir l'SeparatorInset
iOS 7.x ne pourra pas supprimer l'espace blanc que vous voyez sur l'UITableView dans iOS 8.La nouvelle propriété est appelée " layoutMargins ".
La solution:-
Si vous définissez
cell.layoutMargins = UIEdgeInsetsZero;
sans vérifier s'illayoutMargins
existe, l'application se bloque sur iOS 7.x. Ainsi, la meilleure façon serait de vérifier si lelayoutMargins
premier existe avantsetLayoutMargins:UIEdgeInsetsZero
.la source
Vous pouvez utiliser UIAppearance une fois, au démarrage de votre application (avant le chargement de l'interface utilisateur), pour la définir comme paramètres globaux par défaut:
De cette façon, vous gardez le code de votre UIViewController propre et pouvez toujours le remplacer si vous le souhaitez.
la source
iOS présente la propriété layoutMargins sur les cellules ET les vues de tableau.
Cette propriété n'est pas disponible dans iOS 7.0, vous devez donc vous assurer de la vérifier avant de l'attribuer!
Cependant, Apple a ajouté une propriété appelée préserveSuperviewLayoutMargins à votre cellule qui l'empêchera d'hériter des paramètres de marge de votre vue Tableau. De cette façon, vos cellules peuvent configurer leurs propres marges indépendamment de la vue tabulaire. Considérez-le comme une dérogation.
Cette propriété est appelée préserveSuperviewLayoutMargins et la définir sur NO peut vous permettre de remplacer les paramètres layoutMargin de votre vue Tableau par le paramètre layoutMargin de votre propre cellule. Il permet à la fois de gagner du temps ( vous n'avez pas à modifier les paramètres de la vue Table ) et est plus concis. Veuillez vous référer à la réponse de Mike Abdullah pour une explication détaillée.
REMARQUE: il s'agit de l'implémentation appropriée et moins compliquée, comme exprimé dans la réponse de Mike Abdullah; définir la conservation de votre celluleSuperviewLayoutMargins = NO garantira que votre vue Tableau ne remplace pas les paramètres de la cellule.
Première étape - Configurez vos marges de cellule:
Si vous définissez la propriété NO de la propriété conserveSuperviewLayoutMargins sur votre cellule, votre vue de table ne doit pas remplacer vos marges de cellule. Dans certains cas, il ne semble pas fonctionner correctement.
Deuxième étape - Seulement si tout échoue, vous pouvez forcer brutalement vos marges d'affichage de table:
... et c'est parti! Cela devrait fonctionner sur iOS 8 ainsi que sur iOS 7.
Remarque: testé avec iOS 8.1 et 7.1, dans mon cas, je n'avais besoin que de la première étape de cette explication.
La deuxième étape n'est requise que si vous avez des cellules non peuplées sous les cellules rendues, c'est-à-dire. si le tableau est plus grand que le nombre de lignes dans le modèle de tableau. Ne pas effectuer la deuxième étape entraînerait des décalages de séparateur différents.
la source
willDisplayCell
méthode car la méthode elle-même est déjà iOS 8+ et ne sera jamais appelée à partir d'anciennes versions.Dans Swift, c'est un peu plus ennuyeux car
layoutMargins
c'est une propriété, vous devez donc remplacer le getter et le setter.Cela rendra effectivement en
layoutMargins
lecture seule, ce qui dans mon cas est très bien.la source
Pour iOS 9, vous devez ajouter:
Pour plus de détails, veuillez vous référer à la question .
la source
Je voulais juste partager une extension que j'ai faite pour supprimer les marges des séparateurs de cellules tableview.
Utilisé en contexte:
la source
Rapide:
la source
Je l'ai fait fonctionner en faisant ceci:
la source
Quant à ce que cdstamper a suggéré au lieu de la vue de table, l'ajout de lignes ci-dessous dans la méthode layoutSubview de la cellule fonctionne pour moi.
la source
Exemple Swift 3.0:
la source
Après de nombreuses recherches ...
Voici le seul moyen de contrôler complètement ce genre de choses (que j'ai pu trouver)
Pour contrôler complètement les insertions de séparateur et les marges de disposition sur chaque cellule. Pour ce faire, dans la
willDisplayCell
méthode sur votreUITableviewDelegate
.L'objet cellule contrôle le séparateur et le
contentView
contrôle tout le reste. Si vos espaces d'encart séparateur apparaissent dans une couleur inattendue, cela devrait le résoudre:la source
Solution simple dans Swift pour iOS 8 avec une personnalisation
UITableViewCell
De cette façon, vous définissez
layoutMargin
etseparatorInset
une seule fois au lieu de le faire pour chacun,willDisplayCell
comme le suggèrent la plupart des réponses ci-dessus.Si vous utilisez une coutume,
UITableViewCell
c'est le bon endroit pour le faire. Sinon, vous devriez le faire entableView:cellForRowAtIndexPath
.Juste un autre indice: vous n'avez pas besoin de définir
preservesSuperviewLayoutMargins = false
car la valeur par défaut est déjàNO
!la source
Pour moi, la ligne simple a fait le travail
la source
Il suffit d'ajouter le code ci-dessous pour résoudre ce programme.
Bonne chance à toi!
la source
Réponse de Lukasz dans Swift:
la source
Voici le code qui fonctionne pour moi, dans Swift:
Cela me semble le plus propre (pour l'instant), car tous les ajustements de bord / marge cell / tableView sont effectués dans la
tableView:willDisplayCell:forRowAtIndexPath:
méthode, sans bourrer de code inutiletableView:cellForRowAtIndexPath:
.Btw, je ne fais que définir le séparateur gauche de la celluleInset / layoutMargins, car dans ce cas, je ne veux pas bousiller mes contraintes que j'ai définies dans ma cellule.
Code mis à jour vers Swift 2.2:
la source
La plupart des réponses montrent de séparation et empiècements marges de mise en page étant réparties sur une variété de méthodes (c. -à-
viewDidLayoutSubviews
,willDisplayCell
, etc.) pour les cellules et tableviews, mais j'ai trouvé que juste de mettre ces derniers dans descellForRowAtIndexPath
œuvres grandes. Semble comme la manière la plus propre.la source
Utilisez l'extrait de code ci-dessous pour éviter les problèmes de remplissage indésirables pour UITableView dans IOS 8 et 7.
la source
Au lieu de mettre à jour
preservesSuperviewLayoutMargins
et àlayoutMargins
chaque fois que la cellule défile (en utilisantwillDisplayCell
), je suggère de le faire une fois danscellForRowAtIndexPath:
:la source
Voici un moyen simple de supprimer globalement l'encart.
Dans
UITableViewCell+Extensions.swift
:Dans
AppDelegate
application:didFinishLaunchingWithOptions:
:Vous pourriez penser à a) remplacer simplement
separatorInset
l'extension, ou b) définir le proxy d'apparence à lalayoutMargins
place. Ni l'un ni l'autre ne fonctionnera. Même s'ilseparatorInset
est indiqué qu'il s'agit d'une propriété, tenter de la remplacer en tant que propriété (ou méthode) génère des erreurs de compilation. Et définir le proxy d'apparence pourUITableViewCell
'slayoutMargins
(ou, d'ailleurs, définir également les proxys d'apparence pourUITableView
' slayoutMargins
etseparatorInset
) n'a aucun effet.la source
Dans iOS8:
Ajout de ceci à ma sous-classe UITableViewCell:
et ceci à "tableView: cellForRowAtIndexPath" ou "tableView: willDisplayCell":
A FONCTIONNÉ pour moi.
la source
Pour toute cellule spécifique, vous souhaitez masquer le séparateur.
la source
Après avoir vu les réponses à l'étage 3, j'ai essayé de comprendre la relation entre la configuration du séparateur entre TableView et TableViewCell et j'ai fait quelques tests. Voici mes conclusions:
nous pouvons considérer que la mise à zéro du séparateur de cellule doit déplacer le séparateur en deux étapes: la première étape consiste à régler le séparateur de cellule à zéro. la deuxième étape consiste à mettre la marge de la cellule à zéro.
définissez le séparateur de TableView et la disposition de marge peut affecter le séparateur de la cellule . Cependant, d'après le test, je trouve que le jeu de séparateurs de TableView semble être inutile, le marginlayout de TableView peut en fait affecter le marginlayout de la cellule .
définir Cell's PreservesSuperviewLayoutMargins = false, peut couper l' effet marginlayout de TableView sur les cellules.
une des solutions:
la source
C'est ma solution. Cela s'applique à la sous-classe de cellule personnalisée, ajoutez-les simplement à la sous-classe.
2.
Et il est pratique que vous puissiez personnaliser la position du séparateur sans demander à votre concepteur d'en dessiner un pour vous ..........
la source
De manière plus compacte que la réponse la plus votée ...
}
la source
L'ajout de cet extrait, simple et élégant dans Swift, fonctionne pour moi dans iOS8 :)
la source
Cela a parfaitement fonctionné pour moi dans iOS 8 et iOS 9.
Pour OBJ-C
la source