Пользовательский стиль выбора UITableViewCell?

Когда я нажимаю на UITableViewCell, фоновая часть (области, которые не покрывает фоновое изображение) становится синей, когда я нажимаю на ячейку. Кроме того, все UILabel на ячейке становятся белыми, когда нажимаются, что я хочу.

Однако мне не нужен синий фон, когда я нажимаю на него, но если я делаю selectionstylenone, я теряю выделенные цвета для UILabel в ячейке.

Итак, есть ли способ просто избавиться от синего фона при щелчке ячейки, но сохранить выделенные цвета UILabel s?

Ответ 1

Вы можете сделать это следующим образом. Задайте стиль выбора ячейки таблицы UITableViewCellSelectionStyleNone. Это приведет к удалению синего фона. Затем, чтобы сделать выделение текстового ярлыка таким, каким вы хотите, вместо использования класса UITableViewCell по умолчанию, создайте подкласс UITableViewCell и переопределите стандартную реализацию setHighlighted:animated с вашей собственной реализацией, которая устанавливает цвета ярлыков, однако вы хотите в зависимости от выделенного состояния.

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

Ответ 2

Если вы работаете до iOS7, не делайте стиль выбора ячейки

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Осталось, оставьте его UITableViewCellSelectionStyleDefault

Тогда:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

Этот код будет работать правильно

Ответ 3

Вы можете использовать следующие методы делегатов после того, как вы установили стиль выбора в none:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

Внесите свой код здесь, например

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    [cell.lbls setTextColor:[UIColor whiteColor]];
    return indexPath;
}

Ответ 4

В cellForRowAtIndexPath используйте этот код:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

Надеюсь, это сработает для вас.

Наслаждайтесь кодированием:)

Ответ 5

Чтобы получить эту работу, вы должны установить стиль выделения UITableViewCellSelectionStyleNone, а затем вы должны переопределить метод setSelected:animated:, чтобы получить желаемый результат. Это делает то же самое, что и механизм автоматического выбора iOS, когда вы видите синий (или серый) выбор.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if (selected) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

Вы также можете настроить это по-другому, например. путем изменения фона UITableViewCell и т.д.

Ответ 6

Переопределение следующих функций в вашем подклассе UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }

Ответ 7

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

override func setHighlighted(highlighted: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(highlighted, animated: animated)
    super.setHighlighted(highlighted, animated: animated)
}

override func setSelected(selected: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(selected, animated: animated)
    super.setSelected(selected, animated: animated)
}

func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) {

    let action = {
        // Set animatable properties
    }

    if animated {
        UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil)
    }
    else {
        action()
    }
}

Ответ 8

В вашей пользовательской ячейке переопределите стандартную реализацию awakeFromNib и setSelected:

- (void)awakeFromNib {
    // Initialization code
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds];
    imageView.image = [UIImage imageNamed:@"cell_selected_img"];
    self.selectedBackgroundView = imageView;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    if (selected) {
        self.lblCustomText.textColor = [UIColor whiteColor];
    } else {
        self.lblCustomText.textColor = [UIColor blackColor];
    }
}

Также убедитесь, что стиль выделения НЕ установлен на Нет.

Ответ 9

Единственный способ, с помощью которого я мог работать, - это:

- (void)awakeFromNib {
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0];
    bgColorView.layer.masksToBounds = YES;
    self.selectedBackgroundView = bgColorView;
}