J'ai une application où l'incrustation Separator de tableview est définie sur custom - Right 0, left 0. Cela fonctionne parfaitement dans iOS 7.x, mais dans iOS 8.0, je vois que l'insert de séparateur est réglé sur la valeur par défaut de 15 sur la droite. Même si dans les fichiers xib il a la valeur 0, il apparaît toujours incorrectement.
Réponses
Trop de publicités?iOS introduit le layoutMargins de propriété sur les cellules ET les vues de table. Vous aurez besoin de mettre les deux d'entre eux.
Cette propriété n'est pas disponible dans iOS 7.0 vous devez donc vous assurez-vous de vérifier avant de l'affecter!
L'utilisation de Ricky solution pour définir layoutMargin sur la cellule:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Vous devez également définir la même propriété sur la vue de la table. J'ai découvert, grâce à beaucoup de twitter et d'erreurs, que vous devez définir ce en viewDidLayoutSubviews.
Configurer l'affichage de la table de la même façon:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
...et là vous allez! Cela devrait fonctionner dans iOS 8 ainsi que iOS 7.
Edit: Selon @bffmike sur Twitter, vous pouvez également le configurer preservesSuperviewLayoutMargins=PAS sur les cellules. Encore une fois, YMMV.
Prenons un moment pour comprendre le problème avant de aveuglément à la charge pour tenter de le résoudre.
Un rapide fouiner dans le débogueur, vous diront que le séparateur de lignes sont des sous-vues d' UITableViewCell
. Il semble que la cellule elle-même prend une bonne quantité de la responsabilité de la mise en page de ces lignes.
iOS 8 introduit le concept de mise en page marges. Par défaut, un point de vue de la mise en page marges 8pt
sur tous les côtés, et ils sont héritées des ancêtres points de vue.
Du mieux que nous pouvons dire, lors de la présentation de sa ligne de séparation, UITableViewCell
choisit à l'égard de la gauche mise en page de la marge, de l'utiliser pour contraindre la gauche en médaillon.
Mettre tout ça ensemble, à atteindre l'encart de vraiment de zéro, nous avons besoin de:
- Définir la mise en page à gauche de la marge d'
0
- Arrêter tout hérité des marges primordial que
Mettre comme ça, c'est une tâche assez simple à réaliser:
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
Choses à noter:
- Ce code seulement besoin d'être exécuté une fois par cellule (vous êtes tout simplement la configuration de la cellule propriétés, après tout), et il n'y a rien de spécial lorsque vous choisissez exécuter. Faire ce qui semble le plus propre à vous.
- Malheureusement, ni la propriété est disponible pour la configuration de l'Interface Builder, mais vous pouvez spécifier un utilisateur défini par l'exécution de l'attribut pour l'
preservesSuperviewLayoutMargins
si vous le souhaitez. - Clairement, si votre application cibles précédentes OS communiqués de trop, vous aurez besoin pour éviter l'exécution du code ci-dessus jusqu'à ce qu'en cours d'exécution sur iOS 8 et ci-dessus.
- Plutôt que de fixer
preservesSuperviewLayoutMargins
, vous pouvez configurer ancêtre points de vue (comme le tableau) ont0
de la marge de gauche, mais cela semble intrinsèquement plus sujettes à l'erreur que vous n'avez pas de contrôle que l'ensemble de la hiérarchie. - Il serait probablement légèrement nettoyeur de définir la marge de gauche pour
0
et de laisser les autres être. - Si vous voulez avoir un 0 en médaillon sur le "plus" des séparateurs
UITableView
tirages au bas de la plaine de tables de style, je suppose que nécessitera précisant les mêmes paramètres au niveau de la table trop (n'ai pas essayé celui-là!)
Je crois que c'est la même question que j'ai posée ici: Supprimer SeparatorInset sur iOS 8 UITableView pour XCode 6 Simulateur d'iPhone
Dans iOS 8, il y a une nouvelle propriété pour tous les objets héritent d' UIView
. Donc, la solution pour régler le SeparatorInset
dans iOS 7.x ne sera pas en mesure de supprimer l'espace blanc que vous voyez sur la UITableView dans iOS 8.
La nouvelle propriété est appelée "layoutMargins".
@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
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];
}
}
Si vous définissez cell.layoutMargins = UIEdgeInsetsZero;
sans vérifier si l' layoutMargins
existe, l'application crash sur iOS 7.x. Donc, la meilleure façon serait de vérifier si l' layoutMargins
existe tout d'abord avant d' setLayoutMargins:UIEdgeInsetsZero
.