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];
}
Интерпретация различной строки может привести к выделению кнопки.