J'ai trouvé un espace blanc étrange sur UITableView
pour iPhone 6 Simulator (iOS 8) sur XCode 6 GM. J'ai essayé de définir la SeparatorInset
à partir du storyboard et du code, mais l'espace est vide jusqu'à la fin.
Le code suivant fonctionne sur iOS 7 mais pas sur iOS 8 (simulateur iPhone 6).
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
}
J'ai joint la capture d'écran ci-dessous:
J'utilise AutoLayout en passant. J'espère que quelqu'un pourra me montrer un moyen de supprimer l'étrange espace blanc de la TableView
.
Merci aux étudiants de m'avoir dirigé dans la bonne direction avec le commentaire "Essayez ceci self.myTableView.layoutMargins = UIEdgeInsetsZero;" Cette ligne de code ne fonctionnera que sur iOS 8 car layoutMargins est uniquement disponible à partir d'iOS 8. Si j'exécute le même code sur iOS 7, il se bloque.
@property(nonatomic) UIEdgeInsets layoutMargins Description The default spacing to use when laying out content in the view. Availability iOS (8.0 and later) Declared In UIView.h Reference UIView Class Reference
Vous trouverez ci-dessous la bonne solution pour résoudre cet espace blanc étrange en définissant tableview layoutMargins
et cell layoutMargins
sur UIEdgeInsetsZero
s'il existe (pour iOS 8). Et cela ne plantera pas non plus sur iOS 7.
-(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];
}
}
Voir la capture d'écran ci-dessous:-
Essayez de créer une catégorie de classe UITableViewCell et ajoutez ce getter
- (UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero;
}
dans iOS7, cela ne sera pas appelé car il n'y a pas cette propriété dans le SDK et ne provoquera aucun crash crash
Ça marche pour moi
Ma solution avec seulement trois lignes de code:
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)row{
//
// ... your code ...
//
if ([cell respondsToSelector:@selector(preservesSuperviewLayoutMargins)]){
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = false;
}
return cell;
}
IOS8 introduit un nouveau concept nommé Configuration des marges de contenu, une nouvelle propriété nommée layoutMargins est également introduite. Pour plus de détails, reportez-vous au document Apple. Le type de layoutMargins est UIEdgeInsets; la valeur par défaut est {8,8,8,8}. Pour supprimer la ligne de séparation de TableView dans IOS8, en plus de définir tableView.seperatorInset = UIEdgeInsetsZero
, vous devez également procéder comme suit:
D'abord définir la macro
#define isIOS8SystemVersion (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)
Dans la méthode UITableViewDelegate, ajoutez:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *reuseId = @"cellReuseID" ;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
if(!cell){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId];
if(isIOS8SystemVersion){
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins =NO ;
}
}
Cela permettra de supprimer la ligne de séparation. Vous pouvez également faire comme suit:
UITableView *tableView = [[UITableView alloc] init];
if(isIOS8SystemVersion){
tableView.layoutMargins = UIEdgeInsetsZero ;
}
et dans la méthode UITableViewDelegate, ajoutez:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *reuseId = @"cellReuseID" ;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
if(!cell){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId];
if(isIOS8SystemVersion){
cell.layoutMargins = UIEdgeInsetsZero;
}
}
Dans mon cas dans Xcode 6.2, en plus de la réponse de Will Q, je dois accéder à Main.storyboard> sélectionnez l’Inspecteur UITableViewCell> Attributes. Modifiez la liste déroulante Séparateur des encarts par défaut en Encarts personnalisés . Modifiez l’encart gauche de 15 à 0.
Solution de contournement pour iOS 7 et iOS 8
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.separatorInset = UIEdgeInsetsMake(0.0f, cell.frame.size.width, 0.0f, 0.0f);
}
Dans iOS8, vous devez définir Inset both on Row et au niveau de la table.
Niveau de ligne dans cellForRowAtIndexPath:
if ([cell respondsToSelector:@selector(preservesSuperviewLayoutMargins)]){
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = false;
}
Niveau de table dans le viewDidLoad:
[tableReference setSeparatorInset:UIEdgeInsetsZero];
Après cela, c'est une bonne idée de NETTOYER votre projet. À certaines occasions, j'ai remarqué que ces modifications n'étaient pas directement introduites dans l'application exécutable du simulateur.
pour iOS 8
essayez en définissant cell.layoutMargins = UIEdgeInsetsZero;
dans la méthode cellForRowAtIndexPath
Si vous souhaitez supprimer la ligne blanche tout en maintenant le séparateur tel quel, définissez simplement cell.backgroundColor sur tableView backgroundColor. Le simple fait de configurer cell.contentView.backgroundColor ne fait pas disparaître le problème.
J'ai essayé de nombreuses façons, aucune ne fonctionne, mais celle-ci fonctionne pour moi.
Ajoutez simplement ce qui suit:
tableView.separatorStyle = .none
Ajoutez des images de démarrage pour iPhone 6 et plus. Avant que les images ne soient ajoutées, le téléphone s'exécute en mode redimensionnement, c'est-à-dire que les anciennes applications sont redimensionnées pour s'adapter aux nouvelles tailles d'écran. Cela peut être à l'origine des lignes . Les nouvelles images sont Retina HD 5.5 (iPhone6Plus) 1242x2208 et Retina HD 4.7 (iPhone6) 750x1334.
J'ai statique UITableView
et je voulais déplacer la marge d'un séparateur de cellules vers le bord gauche.
Merci aux réponses ci-dessus, c'était ma solution
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
// needed to shift the margin a specific cell to the left Edge
if indexPath.section == 3 && indexPath.row == 0 {
cell.layoutMargins = UIEdgeInsetsZero
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
}
}
Pour que vos séparateurs UITableView soient nuls pour iOS7 et iOS8, au lieu de modifier le code, modifiez le xib pour UITableView en modifiant Affichage-> Mode-> Aspect Remplir.
Voir iOS 8 UITableView séparateur insert 0 ne fonctionne pas
Fondamentalement, vous devez définir le cell.layoutMargin ainsi que le layoutMargin de la tableView. YMMV, mais je devais configurer la vue de table dans layoutSubviews avant que cela ne fonctionne!