Я предполагаю, что вы на самом деле не проверяли, что происходит, чтобы сформировать ваш анализ, чтобы он "применялся к фону всех представлений внутри ячейки".
Iсделал что-то вроде этого:
@interface TestView : UIView {
}
@end
@implementation TestView
-(void)setBackgroundColor:(UIColor*)c {
// Breakpoint here.
NSLog("setBackgroundColor: %@",c);
[super setBackgroundColor:c];
}
@end
...
UIView * v = [[[UIView alloc] initWithFrame:(CGRect){{0,0},{20,20}}] autorelease];
v.backgroundColor = [UIColor magentaColor];
UIView * v2 = [[[TestView alloc] initWithFrame:(CGRect){{5,5},{10,10}}] autorelease];
v2.backgroundColor = [UIColor yellowColor];
[v addSubview:v2];
cell.selectedBackgroundView = v;
Конечным результатом является то, что -setBackgroundColor:
вызывается из -[UITableViewCell _setOpaque:forSubview:]
при выборе представления с чем-то вроде UIDeviceWhiteColorSpace 0 0
(то есть [UIColor clearColor]
).
Или, другими словами, цвет фона некоторых из подпредставлений устанавливается на [UIColor clearColor]
, пока ячейка выбрана, что позволяет selectedBackgroundView просвечивать.Я думаю это происходит потому, что общая оптимизация заключается в том, чтобы дать textLabel
/ detailTextLabel
цвет фона таблицы (например, белый), чтобы он рисовался быстрее, но это означает, что цвет фона должен быть сброшен, когда ячейка
Самое простое решение - использовать вместо этого изображение: изображение 1 на 1 пиксель правильного цвета в UIImageView будет работать, если немного грязно.(У меня была эта проблема при рисовании пользовательских разделительных линий с UIViews высотой 1 пиксель, поэтому я просто включил разделитель в фоновое изображение.)
Альтернативное решение - использовать вместо этого CALayer: добавить подслой 52x52к слою UIImageView и установите цвет фона подслоя.Я почти уверен, что UITableViewCell просто обходит иерархию представления, поэтому он должен игнорировать пользовательские слои.(Большим недостатком слоев является то, что они не имеют автоматического размера, что делает их неподходящими для моих целей, и означает, что правая граница 30px не будет иметь автоматического размера.)
Обходной путь - это создать подкласссоответствующие представления и игнорировать -setBackgroundColor:
, если оно равно [UIColor clearColor]
.