Je personnalise une UITableView
. Je veux masquer la ligne séparant le dernier cellule ... puis-je le faire?
Je sais que je peux faire tableView.separatorStyle = UITableViewCellStyle.None
mais cela affecterait tout les cellules de la table. Je veux que cela n'affecte que ma dernière cellule.
dans viewDidLoad
, ajoutez cette ligne:
self.tableView.separatorColor = [UIColor clearColor];
et dans cellForRowAtIndexPath
:
pour les versions inférieures iOS
if(indexPath.row != self.newCarArray.count-1){
UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
line.backgroundColor = [UIColor redColor];
[cell addSubview:line];
}
pour iOS 7 versions supérieures (y compris iOS 8)
if (indexPath.row == self.newCarArray.count-1) {
cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
Vous pouvez utiliser le code suivant:
Rapide :
if indexPath.row == {your row number} {
cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}
ou :
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)
pour la marge par défaut:
cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)
afficher le séparateur de bout en bout
cell.separatorInset = .zero
Objectif c:
if (indexPath.row == {your row number}) {
cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
Pour donner suite à la réponse de Hiren.
dans ViewDidLoad et la ligne suivante:
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
Ou, si vous utilisez XIB ou que Storyboards change " separator " en " none ":
Et dans CellForRowAtIndexPath ajoutez ceci:
CGFloat separatorInset; // Separator x position
CGFloat separatorHeight;
CGFloat separatorWidth;
CGFloat separatorY;
UIImageView *separator;
UIColor *separatorBGColor;
separatorY = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale); // This assures you to have a 1px line height whatever the screen resolution
separatorWidth = cell.frame.size.width;
separatorInset = 15.0f;
separatorBGColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];
separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];
Voici un exemple de résultat dans lequel j'affiche une vue de table avec des cellules dynamiques (une seule contenant le contenu). Le résultat étant que seul celui-ci a un séparateur et que toutes les vues factices "factices" ne sont pas ajoutées automatiquement pour remplir l'écran.
J'espère que cela t'aides.
EDIT: Pour ceux qui ne lisent pas toujours les commentaires, il existe un meilleur moyen de le faire avec quelques lignes de code:
override func viewDidLoad() {
super.viewDidLoad()
tableView.tableFooterView = UIView()
}
Si vous ne voulez pas dessiner le séparateur vous-même, utilisez ceci:
// Hide the cell separator by moving it to the far right
cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
Cette API est uniquement disponible à partir d’iOS 7.
mon environnement de développement est
les réponses ci-dessus ne fonctionnent pas complètement pour moi
après avoir essayé, ma solution finalement efficace est la suivante:
let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000
Meilleure solution pour iOS 7 et 8
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
DLog(@"");
if (cell && indexPath.row == 0 && indexPath.section == 0) {
DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
}
}
Si votre application est rotative, utilisez 3000.0f comme constante d’encart à gauche ou calculez-la à la volée . Si vous essayez de définir l’encart à droite, vous avez une partie visible du séparateur à gauche de la cellule sur iOS 8.
Dans Swift 3 et Swift 4 , vous pouvez écrire une extension dans UITableViewCell comme ceci:
extension UITableViewCell {
func hideSeparator() {
self.separatorInset = UIEdgeInsets(top: 0, left: self.bounds.size.width, bottom: 0, right: 0)
}
func showSeparator() {
self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
}
Ensuite, vous pouvez utiliser ceci comme ci-dessous (lorsque cellule est votre instance de cellule):
cell.hideSeparator()
cell.showSeparator()
Il est vraiment préférable d’affecter la largeur de la cellule de la vue de tableau en tant qu’incrustation gauche au lieu de lui attribuer un nombre aléatoire. Parce que dans certaines dimensions d'écran, peut-être pas maintenant mais dans le futur, vos séparateurs peuvent toujours être visibles car ce nombre aléatoire peut ne pas être suffisant. De plus, sur iPad en mode paysage, vous ne pouvez pas garantir que vos séparateurs seront toujours invisibles.
Dans iOS 7, le séparateur de cellules de style groupé UITableView a un aspect légèrement différent. Cela ressemble un peu à ceci:
J'ai essayé la réponse de Kemenaran:
cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
Cependant, cela ne semble pas fonctionner pour moi. Je ne sais pas pourquoi. J'ai donc décidé d'utiliser réponse de Hiren, mais en utilisant UIView
au lieu de UIImageView
, et trace la ligne dans le style iOS 7:
UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];
//First cell in a section
if (indexPath.row == 0) {
UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
line.backgroundColor = iOS7LineColor;
[cell addSubview:line];
[cell bringSubviewToFront:line];
} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {
UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
line.backgroundColor = iOS7LineColor;
[cell addSubview:line];
[cell bringSubviewToFront:line];
UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
lineBottom.backgroundColor = iOS7LineColor;
[cell addSubview:lineBottom];
[cell bringSubviewToFront:lineBottom];
} else {
//Last cell in the table view
UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
line.backgroundColor = iOS7LineColor;
[cell addSubview:line];
[cell bringSubviewToFront:line];
}
Si vous utilisez cela, assurez-vous de bien indiquer la hauteur de vue de table correcte dans la deuxième instruction if. J'espère que cela est utile pour quelqu'un.
Dans votre sous-classe UITableViewCell, remplacez layoutSubviews et masquez _UITableViewCellSeparatorView. Fonctionne sous iOS 10.
override func layoutSubviews() {
super.layoutSubviews()
subviews.forEach { (view) in
if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
view.hidden = true
}
}
}
Utilisez cette sous-classe, l'ensemble separatorInset
ne fonctionnant pas pour iOS 9.2.1, le contenu serait compressé.
@interface NSPZeroMarginCell : UITableViewCell
@property (nonatomic, assign) BOOL separatorHidden;
@end
@implementation NSPZeroMarginCell
- (void) layoutSubviews {
[super layoutSubviews];
for (UIView *view in self.subviews) {
if (![view isKindOfClass:[UIControl class]]) {
if (CGRectGetHeight(view.frame) < 3) {
view.hidden = self.separatorHidden;
}
}
}
}
@end
Je ne crois pas que cette approche fonctionnera en toutes circonstances avec des cellules dynamiques ...
if (indexPath.row == self.newCarArray.count-1) {
cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
Quelle que soit la méthode tableview utilisée pour les cellules dynamiques, la cellule sur laquelle vous avez modifié la propriété inset aura toujours la propriété inset définie à chaque fois qu'elle est retirée de la file d'attente, ce qui provoque une série de séparateurs de ligne manquants ... change toi-même.
Quelque chose comme ça a fonctionné pour moi:
if indexPath.row == franchises.count - 1 {
cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}
De cette façon, vous mettez à jour l'état de votre structure de données à chaque chargement
Le plus simple et logique est de faire ceci:
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [[UIView alloc] initWithFrame:CGRectZero];
}
Dans la plupart des cas, vous ne voulez pas voir uniquement le dernier séparateur de tableCiewCell. Et cette approche ne supprime que le dernier séparateur tableViewCell, et vous n’avez pas besoin de penser aux problèmes d’auto-dépose (c’est-à-dire de rotation d’un périphérique) ou de valeurs codées en dur pour configurer des inserts de séparateur.
Dans Swift using iOS 8.4 :
/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath)
{
if indexPath.row == 3 {
// Hiding separator line for only one specific UITableViewCell
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
}
}
Remarque: cet extrait de code ci-dessus fonctionnera sur UITableView à l'aide de cellules dynamiques. Le seul problème que vous pouvez rencontrer concerne l'utilisation de cellules statiques avec des catégories, un type de séparateur différent de zéro et un style groupé pour la vue tabulaire. En fait, dans ce cas particulier, la dernière cellule de chaque catégorie ne sera pas masquée. Pour résoudre ce problème, la solution que j'ai trouvée consistait à définir le séparateur de cellules (via IB) sur none, puis de créer et d'ajouter manuellement (via du code) votre vue linéaire à chaque cellule. Pour un exemple, s'il vous plaît vérifier l'extrait ci-dessous:
/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath)
{
// Row 2 at Section 2
if indexPath.row == 1 && indexPath.section == 1 {
// Hiding separator line for one specific UITableViewCell
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
// Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
let additionalSeparatorThickness = CGFloat(1)
let additionalSeparator = UIView(frame: CGRectMake(0,
cell.frame.size.height - additionalSeparatorThickness,
cell.frame.size.width,
additionalSeparatorThickness))
additionalSeparator.backgroundColor = UIColor.redColor()
cell.addSubview(additionalSeparator)
}
}
En utilisant Swift 3 et en adoptant la méthode de piratage la plus rapide, vous pouvez améliorer le code en utilisant extensions:
extension UITableViewCell {
var isSeparatorHidden: Bool {
get {
return self.separatorInset.right != 0
}
set {
if newValue {
self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
} else {
self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
}
}
}
}
Ensuite, lorsque vous configurez la cellule:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
switch indexPath.row {
case 3:
cell.isSeparatorHidden = true
default:
cell.isSeparatorHidden = false
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)
if cell.isSeparatorHidden {
// do stuff
}
}
si la réponse acceptée ne fonctionne pas, vous pouvez essayer ceci:
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 0.01f; }
C'est bien ;)
Rapide:
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
// remove separator for last cell
cell.separatorInset = indexPath.row < numberOfRowsInSection-1
? tableView.separatorInset
: UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)
return cell
}
Objectif c:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
// remove separator for last cell
cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
? tableView.separatorInset
: UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);
return cell;
}
Dans willdisplaycell
:
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
if([_data count] == 0 ){
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];// [self tableView].=YES;
} else {
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];//// [self tableView].hidden=NO;
}
ajoutez la ligne suivante à viewDidLoad()
:
tableView.separatorColor = UIColor.clearColor()
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellId = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;
if (row == lastRowIndexInSection) {
CGFloat halfWidthOfCell = cell.frame.size.width / 2;
cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
}
}
Je ne pouvais pas cacher le séparateur sur une cellule spécifique, à l'exception de la solution de contournement suivante
- (void)layoutSubviews {
[super layoutSubviews];
[self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
for (UIView *view in self.subviews) {
if (![view isKindOfClass:[UIControl class]]) {
[view removeFromSuperview];
}
}
}
Vous devez prendre une cellule personnalisée, ajouter une étiquette et définir une contrainte telle qu'une étiquette doit couvrir la totalité de la zone de cellule .
- (void)awakeFromNib {
// Initialization code
self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
//self.layoutMargins = UIEdgeInsetsZero;
[self setBackgroundColor:[UIColor clearColor]];
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
}
Définissez également la marge de mise en page UITableView comme suit
tblSignup.layoutMargins = UIEdgeInsetsZero;
Essayez le code ci-dessous, peut vous aider à résoudre votre problème
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString* reuseIdentifier = @"Contact Cell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (nil == cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];
} else {
cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];
}
}
return cell;
}
Mon exigence était de cacher le séparateur entre la 4ème et la 5ème cellule. Je l'ai atteint par
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.row == 3)
{
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
}
}
Le meilleur moyen d'y parvenir est de désactiver les séparateurs de ligne par défaut, la sous-classe UITableViewCell
, et d'ajouter un séparateur de ligne personnalisé en tant que sous-vue de la contentView
- voir ci-dessous une cellule personnalisée utilisée pour présenter un objet de type SNStock
ayant deux propriétés de chaîne, ticker
et name
:
import UIKit
private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1
class SNStockCell: UITableViewCell {
private let primaryTextColor: UIColor
private let secondaryTextColor: UIColor
private let customLineSeparatorView: UIView
var showsCustomLineSeparator: Bool {
get {
return !customLineSeparatorView.hidden
}
set(showsCustomLineSeparator) {
customLineSeparatorView.hidden = !showsCustomLineSeparator
}
}
var customLineSeparatorColor: UIColor? {
get {
return customLineSeparatorView.backgroundColor
}
set(customLineSeparatorColor) {
customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
}
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
self.primaryTextColor = primaryTextColor
self.secondaryTextColor = secondaryTextColor
self.customLineSeparatorView = UIView(frame:CGRectZero)
super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
selectionStyle = UITableViewCellSelectionStyle.None
backgroundColor = UIColor.clearColor()
contentView.addSubview(customLineSeparatorView)
customLineSeparatorView.hidden = true
}
override func prepareForReuse() {
super.prepareForReuse()
self.showsCustomLineSeparator = false
}
// MARK: Layout
override func layoutSubviews() {
super.layoutSubviews()
layoutCustomLineSeparator()
}
private func layoutCustomLineSeparator() {
let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
customLineSeparatorView.frame = CGRectMake(horizontalPadding,
kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
lineSeparatorWidth,
kSNStockCellCellLineSeparatorHeight)
}
// MARK: Public Class API
class func cellHeight() -> CGFloat {
return kSNStockCellCellHeight
}
// MARK: Public API
func configureWithStock(stock: SNStock) {
textLabel!.text = stock.ticker as String
textLabel!.textColor = primaryTextColor
detailTextLabel!.text = stock.name as String
detailTextLabel!.textColor = secondaryTextColor
setNeedsLayout()
}
}
Pour désactiver le séparateur de ligne par défaut, utilisez tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
. Le côté consommateur est relativement simple, voir exemple ci-dessous:
private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
if (cell == nil) {
cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
}
cell!.configureWithStock(stockAtIndexPath(indexPath))
cell!.showsCustomLineSeparator = true
cell!.customLineSeparatorColor = tintColor
return cell!
}
Pour iOS7 et les versions ultérieures, la méthode la plus propre consiste à utiliser INFINITY au lieu de la valeur codée en dur. Vous n'avez pas à vous soucier de la mise à jour de la cellule lorsque l'écran pivote.
if (indexPath.row == <row number>) {
cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
Comme (beaucoup) d’autres l’ont déjà souligné, vous pouvez facilement masquer les séparateurs tous UITableViewCell en les désactivant simplement pour l’ensemble de UITableView; par exemple dans votre UITableViewController
- (void)viewDidLoad {
...
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
...
}
Malheureusement, c’est un vrai PITA à faire par cellule, et c’est ce que vous demandez vraiment.
Personnellement, j’ai essayé de nombreuses permutations pour changer le cell.separatorInset.left
, encore une fois, comme (beaucoup) d’autres l'ont suggéré, mais le problème est, pour citer Apple (souligné par moi):
"... Vous pouvez utiliser cette propriété pour ajouter un espace entre le contenu de la cellule en cours et les bords gauche et droit de la table. Les valeurs d'insertion positives se déplacent le contenu de la cellule} et la cellule séparateur vers l'intérieur et loin des bords de la table ... "
Ainsi, si vous essayez de "masquer" le séparateur en le déplaçant vers la droite, vous pouvez également indenter le contenu de votre cellule. Comme suggéré par crifan, vous pouvez alors essayer de compenser cet effet secondaire désagréable en définissant correctement cell.indentationWidth
et cell.indentationLevel
pour tout déplacer en arrière, mais j’ai également constaté que cela n’était pas non plus fiable (contenu toujours indenté ...).
Le moyen le plus fiable que j'ai trouvé est de surcharger layoutSubviews
dans une simple sous-classe UITableViewCell et de définir l'encart right de sorte qu'il frappe l'encadré gauche, le séparateur ayant une largeur égale à 0 et devant ainsi être invisible fait dans layoutSubviews pour gérer automatiquement les rotations]. J'ajoute également une méthode pratique à ma sous-classe pour l'activer.
@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end
@implementation MyTableViewCellSubclass
- (void)hideSeparator
{
_separatorIsHidden = YES;
}
- (void)layoutSubviews
{
[super layoutSubviews];
if (_separatorIsHidden) {
UIEdgeInsets inset = self.separatorInset;
inset.right = self.bounds.size.width - inset.left;
self.separatorInset = inset;
}
}
@end
Avertissement: il n'y a pas de moyen fiable pour restaurer le texte inséré à droite original, vous ne pouvez donc pas «masquer» le séparateur, d'où la raison pour laquelle j'utilise une méthode hideSeparator
irréversible (vs exposant separatorIsHidden). Veuillez noter que le paramètre separatorInset persiste dans les cellules réutilisées. Par conséquent, comme vous ne pouvez pas "dé-masquer", vous devez conserver ces cellules de séparateur masqué dans leur propre identificateur reuseIdentifier.
Cela fonctionne pour moi lorsque j'utilise l'extension et que j'appelle dans layoutSubviews () pour mettre à jour immédiatement les vues de présentation.
extension UITableViewCell {
func removeSeparator() {
separatorInset = UIEdgeInsetsMake(0, bounds.size.width, 0, 0)
}
}
override func layoutSubviews() {
super.layoutSubviews()
removeSeparator()
}
Le code de toutes les réponses rendra le remplissage des cellules égal à zéro plutôt qu'à la valeur par défaut. J'ai vu le problème dans iOS 11 iPad Pro 12 ''
Mais j'ai une solution ("hack sale") qui consiste à faire une section vide qui fera que la ligne de séparation se cache.
Voici le code que j'ai utilisé:
typedef enum PXSettingsTableSections {
PXSettingSectionInvite = 0,
PXSettingSectionAccount,
PXSettingSectionPrivacy,
PXSettingSectionCreation,
PXSettingSectionTest,
PXSettingSectionAboutHide, // invisble section just to hide separator Line
PXSettingSectionFooterHide, // invisble section just to hide separator Line
PXSettingSectionNumItems,
} PXSettingsTableSectionsType;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return PXSettingSectionNumItems;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case PXSettingSectionInvite: return 1;
case PXSettingSectionAccount:return (isSocialLogin) ? 1 : 2;
case PXSettingSectionPrivacy: return 1;
case PXSettingSectionCreation: return 2;
case PXSettingSectionTest: return 3;
case PXSettingSectionAboutHide: return 3;
default: return 0;
}
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch(section)
{
case PXSettingSectionInvite: return nil;
case PXSettingSectionAccount: return @"Account";
case PXSettingSectionPrivacy: return @"Privacy";
case PXSettingSectionCreation: return @"Someting";
case PXSettingSectionTest: return @"Test";
case PXSettingSectionAboutHide: return @" ";
case PXSettingSectionFooterHide: return @" ";
}
return nil;
}
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
if (section == PXSettingSectionFooterHide || section == PXSettingSectionAboutHide) {
// [UIColor clearColor] will not work
[header.contentView setBackgroundColor:[UIColor whiteColor]];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
// You can control here the size of one specific section
if(section == PXSettingSectionAboutHide){
return 0.0000001; //make it real small
}
return 45.0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
switch(indexPath.section)
{
case PXSettingSectionInvite:
return self.inviteCell;
case PXSettingSectionAccount:
if (isSocialLogin) {
return self.myWalletCell;
}
switch(indexPath.row)
{
case 0: return self.changePasswordCell;
case 1: return self.myWalletCell;
}
case PXSettingSectionPrivacy:
switch(indexPath.row)
{
case 0: return self.privateAccountCell;
}
case PXSettingSectionCreation:
switch(indexPath.row)
{
case 0: return self.videoResolutionCell;
case 1: return self.selfieMirrorCell;
}
case PXSettingSectionTest:
switch(indexPath.row)
{
case 0: return self.termsOfUseImageCell;
case 1: return self.attributionCell;
case 2: return self.aboutCell;
}
case PXSettingSectionAboutHide:{
switch(indexPath.row)
{
case 0: return self.clearCacheCell;
case 1: return self.feedbackCell;
case 2: return self.logoutCell;
}
}
}
return self.emptyCell;
}
À l'intérieur de la classe de cellules tableview. mettre ces lignes de code
separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
Sur iOS9, le problème était que la modification des incrustations de séparateur affectait également le positionnement du label de texte et de détail.
Je l'ai résolu avec ça
override func layoutSubviews() {
super.layoutSubviews()
separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}
Définissez separatorInset.right = .greatestFiniteMagnitude
sur votre cellulaire.