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

Я не вижу, чтобы это поведение было зарегистрировано где угодно. Есть ли что-то, что мне нужно сделать, чтобы это предотвратить? Есть ли другой подход к показу выбора/выделения ячейки, который я должен предпринять, чтобы предотвратить это?
- Примечание. Поскольку это сгруппированное представление таблицы, я устанавливаю разные
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;
}
}];
}