2010-12-02 2 views
36

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

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

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

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

ответ

57

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

Я столкнулся с этой проблемой сегодня и использовал этот подход, однако он заставил кнопку мигать при нажатии на ячейку. Я решил это, установив showTouchWhenHighlighted в NO в начале каждого из этих методов, а затем вернусь к YES в конце. – aranasaurus 2011-12-01 01:42:58

0

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

0

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

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

+1

Это было то, что должно было произойти. Даже настройка подсветки и выбранных состояний на NO для вспомогательных элементов управления, похоже, ничего не делает, если состояние selectionStyle представляет собой нечто иное, чем None. – Gujamin 2012-11-28 19:12:02

2

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

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

Это была моя первая мысль, но это работает только для выбора ячеек, а не для выделения ячейки (событие touch down). – Yetanotherjosh 2011-04-28 20:47:27

1

Я использовал другой подход, это немного проще, я надеюсь, что это работает для вас. Просто установите кнопки он подчеркнули состояние лжи внутри два вышеуказанных методов делегата:

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

Чтобы заставить его работать, я должен был использовать следующие подклассы на UITableViewCell. «Кнопка» объект находится кнопка внутри пользовательской ячейки:

- (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 различных линий могут привести к подсветке кнопки.

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 
} 
Смежные вопросы