Удалить цвет подсветки, но сохранить подсветку изображения в Custom UITableViewCell - PullRequest
1 голос
/ 20 сентября 2010

Я искал это в течение некоторого времени, но я так и не нашел решения.

У меня есть UITableView с пользовательскими ячейками, у этих ячеек есть изображение, и я размещаю на нем метки.

Дело в том, что когда я выбираю ячейку, весь кадр ячейки выбирается с использованием цвета выделения по умолчанию.Я попытался изменить стиль, но если я использую cell.selectionStyle = UITableViewCellSelectionStyleNone;, изображение не будет выделяться ...

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

Ответы [ 6 ]

1 голос
/ 14 декабря 2010

Вот как я это сделал:

Я использую XIB для своей клетки. Там у меня есть фоновое изображение (не подключенное к каким-либо розеткам), которое является моим фоном в нормальном состоянии. Я установил для этого изображения также выделенное изображение (синяя версия в моем случае).

Я добавил еще один UIView, установил очистку его цвета фона и прикрепил его к выходу selectedBackgroundView ячейки. Это препятствует обычному встроенному поведению «установить весь синий фон».

Затем я установил стиль выделения ячейки на синий (просто не может быть None, поскольку подсветка не произойдет).

1 голос
/ 20 сентября 2010

В UITableViewCell есть свойство с именем подсветка.

@property(nonatomic, getter=isHighlighted) BOOL highlighted

Таким образом, вы можете изменить выделенное поведение, переписав этот метод.

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

   // Do custom highlighted behavior here
   ...
}

Или перезаписать setHighlighted:animated: метод.


Something like this?

In MyCustomCell.m

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

   // Do custom highlighted behavior here
   if (value == YES)
   {
        // show highlighted image 
   } else {
        // show image for normal state. 
   }

   // propagate the highlighted message to other views.
   [mChildView setHighlighted:value];
}
0 голосов
/ 15 июля 2016

100% рабочее и простое решение:

Шаг 1: установите cell.selectionStyle = UITableViewCellSelectionStyleNone; в коде или в InterfaceBuilder.
Шаг 2: добавьте 2 метода:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.imageView.highlighted = YES;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.imageView.highlighted = NO;
}

в Swift:

cell?.selectionStyle = .None


override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath)
    cell?.imageView?.highlighted = true;
}

override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath)
    cell?.imageView?.highlighted = false;
}
0 голосов
/ 10 июля 2013

Лучшим решением, которое я смог найти, было заменить ячейку selectedBackgroundView прозрачным представлением и оставить selectionStyle для UITableViewCellSelectionStyleBlue, чтобы выделенное состояние все еще распространялось на все подпредставления (использование UITableViewCellSelectionStyleNone останавливает распространение выделения в подпредставлениях).

UIView *transparentBackground = [[UIView alloc] initWithFrame:cell.bounds];
transparentBackground.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
transparentBackground.backgroundColor = [UIColor clearColor];
cell.selectedBackgroundView = transparentBackground;
0 голосов
/ 14 сентября 2012

Улучшен код Торо.

Работает!

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {

    if (highlighted == YES) {
        // show highlighted image
        [UIView animateWithDuration:0.1f animations:^{
            self.imageViewBanner.alpha = 0.3;
        }];
    } else {
        // show image for normal state.
        [UIView animateWithDuration:0.1f animations:^{
            self.imageViewBanner.alpha = 1.0;
        }];
    }

    [super setHighlighted:highlighted animated:animated];
}
0 голосов
/ 21 сентября 2010

Я нашел очень хорошее решение.

Мне не нужно было переопределять никакие методы.

1 - В моем CustomCell.xib я создал 2 изображения. Один я подключил к выходу myImageView, а другой к selectedBackgroundView.

2 - Для нормального состояния я поместил myCustomBackgroundImg.png, а в выделенное изображение - пустой png, чтобы он не оставался поверх backgroundView при его выборе.

3 - И в выбранномBackgroundView я помещаю myCustomSelectedBackgroundImg.png в изображение нормального состояния.

Надеюсь, это поможет другим.

...