UIButton в UITableViewCell

У меня есть UIButton с изображением внутри UITableViewCell. Когда ячейка выделяется, кнопка также вводит выделенное состояние (т.е. Более темный оттенок изображения), независимо от того, щелкнет ли пользователь в пределах этой кнопки или нет.

Мне не нужна эта функциональность - я хочу, чтобы кнопка была подсвечена при нажатии кнопки, а не при нажатии всей ячейки.

Я попытался установить изображение в выделенном состоянии так же, как и обычное изображение. Это устраняет проблему, однако она не позволяет кнопке изменять цвет, когда он действительно выделен.

Любые идеи о том, как достичь желаемого эффекта?

Ответ 1

Это сводило меня с ума. Я понял, что вам нужно переопределить 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;
}

Ответ 2

Одним из подходов было бы "отменить выбор" или "высвечивать" кнопку, когда выбрана ячейка просмотра таблицы:

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

Ответ 3

Предложение 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
}

Ответ 4

Я использовал другой подход, это немного легче, я надеюсь, что это сработает для вас. Просто установите состояние подсветки кнопки на 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;
}

Ответ 5

На самом деле вы этого не делали, но могли бы вы добавить цель/действие к кнопке для UIControlEventTouchDown, которая обновила изображение с выделенным состоянием до того, что вы хотели, затем еще одна цель/действие для UIControlEventTouchUpInside/UIControlEventTouchUpOutside/UIControlEventTouchCancel, что reset выделенное изображение в соответствии с изображением нормального состояния?

Ответ 6

Возможным обходным решением будет то, что вы установили стиль выбора ячейки как none. В этом случае, когда вы выберете ячейку, она не будет выделена.

Это только возможное обходное решение. Может быть, у вас есть другие вещи в вашем уме.

Ответ 7

Чтобы он работал, мне пришлось использовать следующий подкласс в 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];
}

Интерпретация различной строки может привести к выделению кнопки.