J'ai remarqué que dans iOS 7, UITableViewCells a un saut de ligne dans le séparateur de la cellule que iOS 6 n'a pas. Existe-t-il un moyen de se débarrasser de cette rupture de ligne? La modification du séparateur sur aucun, puis la création d'UIViews avec la couleur du séparateur entraîne toujours le séparateur blanc.
Pour iOS7:
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
Pour iOS8:
Configurez d'abord votre vue de table comme suit:
if ([self.tableView respondsToSelector:@selector(layoutMargins)]) {
self.tableView.layoutMargins = UIEdgeInsetsZero;
}
Ensuite, dans votre méthode cellForRowAtIndexPath: , configurez la cellule comme suit:
if ([cell respondsToSelector:@selector(layoutMargins)]) {
cell.layoutMargins = UIEdgeInsetsZero;
}
Remarque: Incluez les deux layoutMargins et separatorInset , pour prendre en charge les deux versions d'iOS
Vous pouvez également définir le 'Séparateur Encart' dans le storyboard:
Si vous souhaitez prendre en charge les anciennes versions d'iOS, vous devez vérifier la disponibilité de cette méthode avant de l'appeler:
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
Deviner.
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
iOS présente la propriété layoutMargins sur les cellules ET les vues de table.
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é ** à 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 tableau. de celui-ci comme un remplacement.
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:
/*
Tells the delegate the table view is about to draw a cell for a particular row.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath)
{
// Remove seperator inset
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}
}
Si vous définissez la propriété NO devrait, la propriété conserveSuperviewLayoutMargins sur votre cellule empêche la vue de votre table de remplacer les marges de votre cellule. Dans certains cas, il semble ne pas fonctionner correctement.
Deuxième étape - Seulement si tout échoue, vous pouvez forcer brutalement vos marges d'affichage de table:
/*
Called to notify the view controller that its view has just laid out its subviews.
*/
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if self.tableView.respondsToSelector("setSeparatorInset:") {
self.tableView.separatorInset = UIEdgeInsetsZero
}
if self.tableView.respondsToSelector("setLayoutMargins:") {
self.tableView.layoutMargins = UIEdgeInsetsZero
}
}
... 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 réponse sélectionnée n'a pas fonctionné pour moi. Mais cela oui et cela fonctionne à partir d'ios 2.0:
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
Pour une solution permanente à l'échelle de l'application, appelez ceci dans l'application: didFinishLaunching .. n'importe quelle table sera "corrigée"
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
[[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero];
}
Et dans iOS 8, basé sur le post de Seth McFarlane ici , vous devez commencer à traiter avec layoutMargins. Ce qui suit l'a fait pour moi:
Dans ApplicationDidFinishLaunching, exécutez ce qui suit:
if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) {
[[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero];
}
Créez la catégorie suivante sur UITableView:
@interface UITableView(WJAdditions)
-(void) wjZeroSeparatorInset;
@end
@implementation UITableView (WJAdditions)
-(void) wjZeroSeparatorInset {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
self.layoutMargins = UIEdgeInsetsZero;
}
#endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if ([self respondsToSelector: @selector(setSeparatorInset:)])
self.separatorInset = UIEdgeInsetsZero;
}
#endif
}
@end
Dans vos UITableViews, peu de temps après l'initialisation, appelez
[self wjZeroSeparatorInset];
Dans vos UITableViewControllers, vous avez besoin des éléments suivants:
-(void) viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
UITableView* tv = self.tableView;
if ([tv respondsToSelector:@selector(setLayoutMargins:)]) {
[tv setLayoutMargins:UIEdgeInsetsZero];
}
}
Dans iOS 8, il semble y avoir un petit bug. La valeur personnalisée pour l'encart de séparateur n'est pas appliquée aux cellules contenant du texte. J'ai essayé de le configurer à partir du générateur d'interface et du code, mais aucun n'a fonctionné. J'ai également déposé un rapport de bogue.
En attendant, j'ai une petite solution pour y parvenir. Je trace simplement la ligne sur la cellule. Créez une sous-classe de UITableViewCell
et remplacez la méthode drawRect
. N'oubliez pas non plus de définir la propriété separator de UITableView
sur None. Voici le code. C'est dans Swift mais comme c'est fondamentalement C, vous pouvez également utiliser la même chose dans Objective-C.
override func drawRect(rect: CGRect) {
super.drawRect(rect)
let context = UIGraphicsGetCurrentContext()
CGContextSetStrokeColorWithColor(context, UITableView().separatorColor.CGColor) // seperator color
CGContextSetLineWidth(context, 2) // separator width
CGContextMoveToPoint(context, 0, self.bounds.size.height)
CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height)
CGContextStrokePath(context)
}
Réinitialiser separatorInset résout ce problème pour moi:
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:self.tableView.separatorInset];
}
La solution:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Attention, la définition de separatorInset of tableView sur UIEdgeInsetsZero semble casser la marge gauche des titres de section en même temps! (au moins, c'est le cas sur iOS 7.1)
Si vous souhaitez afficher les titres de section avec tableView: titleForHeaderInSection: et obtenir toujours l'effet souhaité de ne pas couper de ligne entre UITableViewCells, vous devez définir le separatorInset directement sur les cellules au lieu de tableView!
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// ...
[cell setSeparatorInset:UIEdgeInsetsZero];
Pour iOS8 + cela a fonctionné pour moi,
tableView.layoutMargins = UIEdgeInsetsZero
et dans la méthode cellForRowAtIndexPath
:
cell.layoutMargins = UIEdgeInsetsZero;
@implementation UITableView (HGApperance)
-(void)setSeparatorXMargin:(CGFloat)margin{
// iOS 7
if ([self respondsToSelector:@selector(setSeparatorInset:)]) {
[self setSeparatorInset:UIEdgeInsetsZero];
}
if ([self respondsToSelector:@selector(layoutMargins)]) {
self.layoutMargins = UIEdgeInsetsZero;
}
}
@end
Pour UITableviewCell, la réponse de Willam fonctionne parfaitement.
Vers iOS8 et supérieur
Si vous trouvez que toutes les solutions ne fonctionnent pas comme moi, je pense que vous avez peut-être utilisé la sous-classe de UITableViewCell
et ignoré la méthode layoutSubviews
, si vous remplissez deux conditions, continuez à lire .
Faites-le ou vérifiez-le étape par étape.
1 、 Après avoir alloué et initialisé le UITableView
, définissez sa propriété layoutMargins
.
if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
_tableView.layoutMargins = UIEdgeInsetsZero ;
}
2 、 Dans la méthode - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
, après avoir alloué et initialisé votre UITableViewCell
personnalisé, définissez sa propriété layoutMargins
.
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
cell.layoutMargins = UIEdgeInsetsZero ;
}
3 、 La partie la plus importante entre en jeu. Si vous surchargez la méthode - (void)layoutSubviews
de UITableViewCell, n'oubliez pas d'appeler son super.
- (void)layoutSubviews
{
[super layoutSubviews] ;
// layout the subviews
}
- (void)viewDidLoad
{
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[super viewDidLoad];
// Additional setup
}
Remarque: la ligne setSeparatorStyle doit être au-dessus du super appel.
J'ai étendu le séparateur UITableView sur toute la largeur dans Xamarin.iOS sur iOS 8.4 avec l'aide de publications de Luis E. Prado et Roi-sorcier . J'ai dû définir à la fois SeparatorInset et LayoutMargins pour le faire fonctionner. Je n'ai pas rédigé de chèques pour les versions iOS inférieures depuis que je cible iOS 8 et supérieur.
J'ai écrit les deux méthodes d'extension C # suivantes pour définir la pleine largeur du séparateur UITableView au niveau UITableView ou UITableViewCell. Vous pouvez utiliser l'une de ces méthodes ou les deux en fonction de l'effet souhaité (voir les explications ci-dessous).
ITableView
Définissez les propriétés UITableView pour modifier les séparateurs qui apparaissent après les cellules vides. Cette méthode SetLayoutMarginsZero peut être appelée à partir de la méthode ViewDidLoad de ViewController associée.
public static void SetLayoutMarginsZero(this UITableView tableView)
{
tableView.SeparatorInset = UIEdgeInsets.Zero;
tableView.LayoutMargins = UIEdgeInsets.Zero;
}
ITableViewCell
Définissez les propriétés UITableViewCell pour modifier les séparateurs qui apparaissent après les cellules remplies. Cette méthode SetLayoutMarginsZero peut être appelée à partir de la méthode TableViewSource GetCell.
public static void SetLayoutMarginsZero(this UITableViewCell tableViewCell)
{
tableViewCell.SeparatorInset = UIEdgeInsets.Zero;
tableViewCell.LayoutMargins = UIEdgeInsets.Zero;
tableViewCell.PreservesSuperviewLayoutMargins = false;
}