Вопрос по ios, selection, uitableview, click, objective-c – Пользовательский стиль выбора UITableViewCell?

74

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

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

Так есть ли способ просто избавиться от синего фона при нажатии на ячейку, но сохранить выделенные цветаUILabels?

Ваш Ответ

10   ответов
166

и таблицы на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];
    }
}
@jonkroll Я понял эту концепцию, но мое требование заключается в том, чтобы при выделении ячейки цвет textLabel этой ячейки оставался в качестве selectedColor, сейчас он просто меняет цвет textLabel при выделении, после этого выделенная текстовая метка остается в исходном цвете
Должны ли мы позвонить[super setHighlighted:highlighted animated:animated]; ?
Но у этого метода есть одна проблема, когда вы переопределяетеsetHighlighted а такжеsetSelected, Сначала вы выбираете ячейку, хорошо, текст textColor меняется на белый, затем вы прокручиваете эту ячейку из визуальной части экрана, затем прокручиваете назад, видите, textColor становится черным
Большое спасибо! Работает как шарм! И это дает мне контроль над выделением других пользовательских представлений в ячейке, если я хочу, потому что стандартное выделение делает это странным.
Как примечание стороны, убедитесь, что вы переопределяетеsetHighlighted:animated:, который принимаетanimated параметр. Переопределение одного параметраsetHighlighted: метод не сработает.
4

UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }
Я переопределял только setSelected, поэтому по какой-то причине ячейка все еще иногда мигала.
Спасибо; это было единственное, что не приводило к выбору всей строки от левого края экрана вправо при изменении цвета фона.
12

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

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

Этот ответ должен быть сверху. :)
Это не сработает. Если вы хотите сделать [cell.textLabel setHighlightedTextColor: [UIColor blueColor]]; Ячейка selectionStyle не должна быть NONE.
70

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Остальное оставьUITableViewCellSelectionStyleDefault

Затем:

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

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

selectionstyle должен быть selectionStyle
Повышение рейтинга - это единственное решение, которое помогло мне изменить нетекстовый цвет выбранной ячейки в iOS 7.
@iBradApps ... здесь вы не создаете никакого пользовательского класса ... ячейки пользовательского интерфейса таблицы
Этот метод является единственным способом, который полностью идентичен Apple «из коробки». поведение выбора ячейки. Следует принять ответ.
Это решение работало на iOS7, но только после того, как я установил selectionStyle в UITableViewCellStyleDefault.
0

awakeFromNib & amp; 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];
    }
}

Также убедитесь, чтоselection style являетсяNOT установлен вNone.

2

вы хотите переопределить оба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()
    }
}
11

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 и т. д.

0

- (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;
}
0

Сначала установите стиль выделения для вашей ячейки:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Далее в пользовательском классе ячеек переопределите этот метод на примере анимации:

  - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        [UIView animateWithDuration:0.15f animations:^{
            self.contentView.alpha = 0.5f;
        }];
    } else {
        [UIView animateWithDuration:0.35f animations:^{
            self.contentView.alpha = 1.f;
        }];
    }
  }
16

выбора равным 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;
}
Возможным недостатком здесь является то, что этот метод не вызывается, пока ваш палец не покинет выбранную ячейку; некоторые другие подходы вступают в силу, как только вы касаетесь клетки.
Отлично & amp; чистый раствор! Вам нужно только реализовать вызов willDeselectRowAtIndexPath, и он работает как по волшебству!

Похожие вопросы