Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIButton in UITableViewCell

I have a UIButton with an image inside of a UITableViewCell. When the cell is being highlight, the button is also entering the highlighted state (i.e. a darker shade of the image), regardless of whether the user is clicking within the bounds of the button or not.

I don't want this functionality - I only want the button to be highlighted when the button is clicked, not when the entire cell is being clicked.

I've tried to set the image in the highlighted state to be the same as the normal image. This fixes the issue however it stops the button from changing color when it really is highlighted.

Any ideas how to achieve the desired effect?

like image 624
NRaf Avatar asked Dec 02 '10 05:12

NRaf


3 Answers

This was driving me crazy. I figured out that you need to override setHighlighted:animated: and 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;
}
like image 93
codecaffeine Avatar answered Oct 05 '22 04:10

codecaffeine


One approach would be to "deselect" or "unhighlight" the button when the table view cell is selected:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  [yourButton setHighlighted:NO];
  // do something cool
}
like image 2
joshpaul Avatar answered Oct 05 '22 03:10

joshpaul


codecaffeine's suggestion didn't work for me (iOS 8.3), but it did put me on the right track. I modified it like this (it's in Swift though):

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
}
like image 2
Anthony De Smet Avatar answered Oct 05 '22 03:10

Anthony De Smet