2010-12-02 9 views
36

J'ai un UIButton avec une image à l'intérieur d'un UITableViewCell. Lorsque la cellule est en surbrillance, le bouton entre également dans l'état en surbrillance (c'est-à-dire une nuance plus sombre de l'image), que l'utilisateur clique ou non dans les limites du bouton.UIButton dans UITableViewCell

Je ne veux pas cette fonctionnalité - je veux seulement que le bouton soit surligné quand on clique sur le bouton, pas quand on clique sur la cellule entière.

J'ai essayé de définir l'image en surbrillance comme étant l'image normale. Cela résout le problème mais il arrête le bouton de changer de couleur quand il est vraiment en surbrillance.

Des idées pour obtenir l'effet désiré?

Répondre

57

Cela me rendait fou. Je me suis dit que vous avez besoin de passer outre setHighlighted:animated: et setSelected:animated:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    [super setHighlighted:highlighted animated:animated]; 
    self.yourButton.highlighted = NO; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    [super setSelected:selected animated:animated]; 
    self.yourButton.selected = NO; 
    // If you don't set highlighted to NO in this method, 
    // for some reason it'll be highlighed while the 
    // table cell selection animates out 
    self.yourButton.highlighted = NO; 
} 
+4

J'ai rencontré ce problème aujourd'hui et utilisé cette approche, mais il a fait clignoter le bouton lorsque vous appuyez sur la cellule. J'ai résolu ce problème en réglant showsTouchWhenHighlighted sur NO au début de chacune de ces méthodes, puis de nouveau sur YES à la fin. – aranasaurus

+0

@Zemm Excellent. J'ai vu cela quelques fois mais je n'ai jamais été capable de le réparer. – codecaffeine

+4

ne fonctionne pas pour moi = ( – Irina

0

avez pas vraiment essayé, mais pourriez-vous ajouter peut-être une cible/action sur le bouton pour UIControlEventTouchDown qui met à jour son image à l'état mis en évidence ce que vous vouliez, puis une autre cible/action pour UIControlEventTouchUpInside/UIControlEventTouchUpOutside/UIControlEventTouchCancel que la réinitialisation l'image en surbrillance pour correspondre à l'image de l'état normal?

0

Une solution possible consiste à définir le style de sélection de cellule sur Aucun. Dans ce cas, lorsque vous sélectionnez la cellule, elle ne sera pas mise en surbrillance.

Ceci est seulement, la solution de contournement possible. Peut-être avez-vous d'autres choses dans votre esprit.

+1

C'était ce qui devait arriver. Même le réglage des hautes lumières et des états sélectionnés sur NO pour les sous-contrôles ne semble pas faire quoi que ce soit si l'état selectStyle est différent de None. – Gujamin

2

Une approche serait de « désactiver » ou « pas surligner » le bouton lorsque la vue de la table cellule est sélectionnée:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [yourButton setHighlighted:NO]; 
    // do something cool 
} 
+0

c'était ma première pensée, mais cela ne fonctionne que pour la sélection de cellules, pas pour la surbrillance de la cellule (événement touchdown) – Yetanotherjosh

1

Je l'ai utilisé une approche différente, il est un peu plus facile, je l'espère cela fonctionne pour vous. Il suffit de régler le bouton en surbrillance de l'état false dans les deux méthodes de délégué ci-dessus:

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIButton *btnAction = (UIButton *) [[tableView cellForRowAtIndexPath:indexPath] viewWithTag:3]; 
    btnAction.highlighted = NO; 
} 


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIButton *btnAction = (UIButton *) [[tableView cellForRowAtIndexPath:indexPath] viewWithTag:3]; 
    btnAction.highlighted = NO; 
} 
0

Pour le faire fonctionner, je devais utiliser le sous-classement suivant sur la UITableViewCell. L'objet « bouton » est le bouton intérieur de la cellule personnalisée:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    [self.button setShowsTouchWhenHighlighted:NO]; 
    [super setHighlighted:highlighted animated:animated]; 

    self.button.highlighted = NO; 
    [self.button setShowsTouchWhenHighlighted:YES]; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    [self.button setShowsTouchWhenHighlighted:NO]; 
    [super setSelected:selected animated:animated]; 
    self.button.highlighted = NO; 

    // Configure the view for the selected state 
    [self.button setShowsTouchWhenHighlighted:YES]; 
} 

Interverting les différents ligne peut entraîner la mise en évidence du bouton.

2

La suggestion de codecaffeine n'a pas fonctionné pour moi (iOS 8.3), mais elle m'a mis sur la bonne voie. Je l'ai modifié comme ceci (c'est dans Swift si):

override func setHighlighted(highlighted: Bool, animated: Bool) { 
    var colorBefore = self.myButton.backgroundColor 
    super.setHighlighted(highlighted, animated: animated) 
    self.myButton.highlighted = false 
    self.myButton.backgroundColor = colorBefore 
}