Подтвердить что ты не робот

ВыбранныйBackgroundView изменяет subviews contentView

Я использую пользовательские backgroundView и selectedBackgroundView для подкласса UITableViewCell. Эти ячейки находятся в сгруппированной таблице, поэтому я устанавливаю фон и выбранный фон как UIImageView на основе строки ячейки в cellForRowAtIndexPath:.

Проблема, с которой я столкнулась, заключается в том, что когда ячейка выбрана, ее selectedBackgroundView изменяет содержимое contentView. Например, после выбора и/или выделения ячейки, UILabel в contentView имеет свои изменения backgroundColor, а UIView, используемый как разделитель ячеек, не отображается.

Перед выбором: Before selection/highlight После выбора: After selection/highlight

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

  • Примечание. Поскольку это сгруппированное представление таблицы, я устанавливаю разные backgroundView и selectedBackgroundView с UIImageView для учета округлых углов в верхней и нижней ячейках раздела cellForRowAtIndexPath:, но у меня есть та же проблема при использовании по умолчанию UITableViewSelectionStyleBlue.

Изменить 1:

В ответе a0 я перегрузил setHighlighted:animated:. Я не уверен, насколько надежна реализация, но этот подход сработал для поддержания свойств highlighted и backgroundColor в subviews:

NSArray *recursiveAllSubviews = [self recursiveValueForKey:@"subviews"]; // Uses MTRecursiveKVC Cocoapod
NSArray *backgroundColors = [recursiveAllSubviews valueForKey:@"backgroundColor"];
[super setHighlighted:highlighted animated:animated];
if (highlighted) {
    [recursiveAllSubviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger index, BOOL *stop){
        if ([view respondsToSelector:@selector(setHighlighted:)]) {
            [view setValue:[NSNumber numberWithBool:NO] forKey:@"highlighted"];
        }
        id possiblyNull = [backgroundColors objectAtIndex:index];
        if (possiblyNull != [NSNull null]) {
            view.backgroundColor = possiblyNull;
        }
    }];
}
4b9b3361

Ответ 1

UITableViewCell делает две вещи автоматически, когда выделено/выбрано:

  • Задайте все свои подпункты backgroundColor, чтобы очистить цвет (прозрачный).
  • Выделите все подпункты, которые можно выделить, например UIImageView.

Чтобы предотвратить первую проблему, вы должны переопределить эти два метода в своем подклассе UITableViewCell:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];
    if (highlighted) {
        // Recover backgroundColor of subviews.
    }
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    if (selected) {
        // Recover backgroundColor of subviews.
    }
}

Ответ 2

  • set cell.selectionStyle = UITableViewCellSelectionStyleNone
  • переопределить

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if(highlighted){ self.contentView.backgroundColor = colorYouWantWhenHighlighted; }else{ self.contentView.backgroundColor = colorYouWantWhenUnhighlighted; } }

Ответ 3

В моем случае у меня было две кнопки в UITableViewCell, цвета фона которых очищались. Эти кнопки имели тип GrayButton, пользовательский класс, который я написал, выводит UIButton. Вместо того, чтобы переопределять методы UITableViewCell, я вместо этого переопределяю метод GrayButton setBackgroundColor::

- (void)setBackgroundColor:(UIColor *)backgroundColor
{
    if (backgroundColor != [UIColor clearColor]) {
        [super setBackgroundColor:backgroundColor];
    }
}

Ответ 4

В моем случае я переключился на contentView, и он работает намного лучше

UIColor *backgroundColor = selected ? [UIColor redColor] : [UIColor clearColor];
self.contentView.backgroundColor = backgroundColor;

вместо замены selectedBackgroundView

 UIView *selectionColor = [[UIView alloc] init];
selectionColor.backgroundColor = selected ? [UIColor redColor] : [UIColor clearColor];;
self.selectedBackgroundView = selectionColor;
[selectionColor release];

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