UITableViewCell 中的 UIButton

36

我有一个 UITableViewCell 里面带有一个包含图片的 UIButton。当单元格处于高亮状态时,按钮也会进入高亮状态(即图像变为较暗色),无论用户是否在按钮范围内点击。

我不需要这个功能 - 我只想在点击按钮时突出显示按钮,而不是整个单元格被点击时。

我尝试将高亮状态下的图像设置为与正常图像相同。这样可以解决问题,但是它会阻止按钮在真正被突出显示时改变颜色。

有什么方法可以实现所需效果吗?

7个回答

56
这让我很疯狂。我发现你需要覆盖 setHighlighted:animated: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
今天我遇到了这个问题并使用了这种方法,但是当点击单元格时它会使按钮闪烁。我通过在每个方法的开头将showsTouchWhenHighlighted设置为NO,然后在结尾再设置成YES来解决这个问题。 - aranasaurus
@Zemm 很好。我已经看到过几次,但从未能够修复它。 - codecaffeine

2

codecaffeine的建议对我(iOS 8.3)没有用,但它确实让我找到了正确的方向。我进行了如下修改(使用Swift语言):

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
}

2
一种方法是在选择表格视图单元格时“取消选择”或“取消高亮”按钮:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  [yourButton setHighlighted:NO];
  // do something cool
}

这是我的第一想法,但这仅适用于单元格选择,而不适用于单元格高亮(触摸按下事件)。 - Yetanotherjosh

1

我采用了不同的方法,它更加简单,希望对你有用。只需在上述两个委托方法中将按钮的高亮状态设置为false:

-(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

我没有实际尝试过这个,但是你可以尝试为UIControlEventTouchDown添加一个目标/操作,以更新其高亮状态图像到所需的内容,然后为UIControlEventTouchUpInside/UIControlEventTouchUpOutside/UIControlEventTouchCancel添加另一个目标/操作,以将高亮图像重置为与正常状态图像相匹配的内容。


0
一个可能的解决方法是将单元格选择样式设置为无。在这种情况下,当您选择单元格时,它不会被突出显示。
这只是可能的解决方法。也许您有其他想法。

1
那就是需要发生的事情。即使将子控件的高亮和选定状态设置为NO,如果selectionStyle状态不是None,则似乎什么也没有发生。 - Kudit

0
为了使其工作,我不得不在UITableViewCell上使用以下子类化。'button'对象是自定义单元格内的按钮:
- (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];
}

交换各行可能导致按钮的高亮显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接