Je crée une UITableView
avec UITableViewCell
s personnalisé. Le nouveau bouton de suppression d'iOS 7 provoque des problèmes de mise en page de ma cellule.
Si j'utilise le bouton "Modifier", ce qui fait apparaître les cercles rouges, le problème me pose problème, mais si je glisse une seule cellule, elle a l'air parfaite.
C'est quand le bouton Edit est utilisé:
[self.tableView setEditing:!self.tableView.editing animated:YES];
C'est quand je glisse une seule cellule:
Comme vous pouvez le voir, mes étiquettes chevauchent le bouton Supprimer du premier exemple. Pourquoi fait-il cela et comment puis-je le réparer?
essayez d’utiliser les propriétés accessoryView
et editingAccessoryView
de votre UITableViewCell
au lieu d’ajouter la vue vous-même.
Si vous souhaitez que le même indicateur soit affiché en mode édition et en mode non-édition, essayez de définir les deux propriétés de la vue pour qu'elles pointent sur la même vue dans votre uiTableViewCell
comme:
self.accessoryView = self.imgPushEnabled;
self.editingAccessoryView = self.imgPushEnabled;
Il semble y avoir un petit problème dans l’animation de modification de table dans IOS7, ce qui confère un chevauchement du bouton de suppression et de la variable accessoryView
lors du retour à l’état non modifié. Cela semble se produire lorsque accesoryView
est spécifié et que editingAccessoryView
est nil
.
Une solution de contournement à ce problème semble être de spécifier une édition invisible AccessAccessoryView comme:
self.editingAccessoryView =[[UIView alloc] init];
self.editingAccessoryView.backgroundColor = [UIColor clearColor];
J'ai résolu ce problème avec des contraintes de configuration sans largeur, mais uniquement en tête et en fin.
Le problème est que, en mode édition, la taille de contentView de la cellule change. Donc, soit vous devez remplacer layoutSubviews
dans votre cellule et prendre en charge les différentes tailles de trame
- (void) layoutSubviews
{
[super layoutSubviews];
CGRect contentFrame = self.contentView.frame;
// adjust to the contentView frame
...
}
ou vous mordez à l'hameçon et passez en autolayout.
Premièrement, je pensais que régler contentView.clipsToBounds
sur YES
pourrait être une solution de contournement laide, mais cela ne semble pas fonctionner.
Comme cela a été mentionné, vous pouvez passer à l'autolayout pour résoudre ce problème. Mais, si vous ne voulez pas (naturellement) vouloir jouer avec l'autolayout pour cette seule instance, vous pouvez définir le masque autoresizing et le transformer automatiquement en contraintes appropriées pour autolayout.
label.autoresizingMask = UIViewAutoresizingFlexibleWidth;
Utilisez simplement cette méthode dans votre classe TableViewCell personnalisée pour obtenir la réponse parfaite.
Ici self
est UITableviewCell
- (void)layoutSubviews {
[super layoutSubviews];
for (UIView *subview in self.subviews) {
for (UIView *subview2 in subview.subviews) {
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view
[subview bringSubviewToFront:subview2];
}
}
}
}
Et si quelqu'un veut ajuster la taille du bouton Supprimer, utilisez le code suivant
- (void)layoutSubviews {
[super layoutSubviews];
for (UIView *subview in self.subviews) {
for (UIView *subview2 in subview.subviews) {
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view
CGRect rect = subview2.frame;
rect.size.height = 47; //adjusting the view height
subview2.frame = rect;
for (UIButton *btn in [subview2 subviews]) {
if ([NSStringFromClass([btn class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) { // adjusting the Button height
rect = btn.frame;
rect.size.height = CGRectGetHeight(subview2.frame);
btn.frame = rect;
break;
}
}
[subview bringSubviewToFront:subview2];
}
}
}
}
Afficher UITableViewCellDeleteConfirmationView
dans la layoutSubviews
de la cellule personnalisée fonctionne pour moi sur iPhone, mais pas sur iPad.
J'ai une UITableView
dans la partie principale d'une splitViewController
pour iPad, et dans ce cas Le cadre de la UITableViewCellDeleteConfirmationView
est (768 0; 89 44) au lieu de (320 0; 89 44)
Donc, je redimensionne le cadre dans la méthode layoutSubviews
et cela fonctionne pour moi
- (void)layoutSubviews {
[super layoutSubviews];
for (UIView *subview in self.subviews)
{
for (UIView *subview2 in subview.subviews)
{
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"])
{
CGRect frame = subview2.frame;
frame.Origin.x = 320;
subview2.frame = frame;
[subview bringSubviewToFront:subview2];
}
}
}
}
Le meilleur moyen de supprimer ce problème est d’ajouter une image dans une cellule et de la définir dans Verso.
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgImg.png"]];
imageView.frame = CGRectMake(0, 0, 320, yourCustomCell.frame.size.height);
[yourCustomCell addSubview:imageView];
[yourCustomCell sendSubviewToBack:imageView];
Si votre texte chevauche le bouton de suppression, implémentez Autolayout. Ça va mieux gérer.
Un autre cas peut être généré, c'est-à-dire que cellSelectionStyle serait mis en surbrillance avec la couleur par défaut. Vous pouvez définir la couleur de surbrillance comme suit
yourCustomCell.selectionStyle = UITableViewCellSelectionStyleNone;
Définissez le style de sélection de votre cellule de tableau sur UITableViewCellSelectionStyleNone. Cela supprimera le fond bleu en surbrillance ou autre. Ensuite, pour que l'étiquette de texte ou la vue de contenu mettant en surbrillance fonctionne comme vous le souhaitez, utilisez cette méthode dans la classe yourCustomCell.m.
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
if (highlighted)
self.contentView.backgroundColor = [UIColor greenColor];
else
self.contentView.backgroundColor = [UIColor clearColor];
}
J'espère que vous comprenez mieux.
Si vous placez du contenu dans le contentView de UITableViewCell, assurez-vous d'utiliser self.contentView.frame.size.width
et non self.frame.size.width
dans layoutSubviews.
self.frame
agrandit la largeur en mode édition et fait en sorte que tout le contenu à droite dépasse les limites de contentView. self.contentView.frame
reste à la largeur correcte (et est ce que vous devriez utiliser).
Ma solution consiste à déplacer tout le contenu de la vue vers la gauche lorsque le bouton Supprimer affiche:
override func layoutSubviews() {
super.layoutSubviews()
if editingStyle == UITableViewCellEditingStyle.Delete {
var rect = contentView.frame
rect.Origin.x = self.showingDeleteConfirmation ? -15 : 38
contentView.frame = rect
}
}
Essayez ceci: vous définissez peut-être la cellule setBackgroundImage dans cellForRowAtIndexPath (Méthode Delegate). Ne définissez pas ceci ici. Définissez votre image en:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellList.png"]]; }
Profitez de codage.