ВыбранныйBackgroundView изменяет subviews contentView
Я использую пользовательские backgroundView
и selectedBackgroundView
для подкласса UITableViewCell
. Эти ячейки находятся в сгруппированной таблице, поэтому я устанавливаю фон и выбранный фон как UIImageView
на основе строки ячейки в cellForRowAtIndexPath:
.
Проблема, с которой я столкнулась, заключается в том, что когда ячейка выбрана, ее selectedBackgroundView
изменяет содержимое contentView
. Например, после выбора и/или выделения ячейки, UILabel
в contentView
имеет свои изменения backgroundColor
, а UIView
, используемый как разделитель ячеек, не отображается.
Перед выбором:
После выбора:
![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;
}
}];
}
Ответы
Ответ 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];
теперь проблема видна только в том случае, если ячейка, к которой вы нажимаете и запускаете прокрутку, не является выбранной ячейкой.