Процесс выделения ячеек может показаться сложным и запутанным, если вы не знаете, что происходит.Я был полностью сбит с толку и сделал некоторые обширные эксперименты.Вот заметки о моих выводах, которые могут кому-то помочь (если кому-то есть что добавить или опровергнуть, тогда, пожалуйста, прокомментируйте, и я постараюсь подтвердить и обновить)
В обычном состоянии «не выбрано»
- ContentView (что в вашем XIB, если вы не кодировали его иначе) рисуется нормально
selectedBackgroundView
скрыт backgroundView
является видимым (при условии, что ваш contentView прозрачен, вы видите backgroundView
или (если вы не определили backgroundView
, вы увидите цвет фона самого UITableView
)
Ячейка выбрана, сразу же происходит -OUT любая анимация:
- Все представления / подпредставления в пределах viewView очищены (или установлены прозрачными)
backgroundColor
, меткаизменение цвета текста и т. д. на выбранный цвет - .
selectedBackgroundView
становится видимым (это представление всегда имеет полный размер ячейки (пользовательский фрейм игнорируется, используйте подпредставление, если вам нужно). Также обратите внимание наbackgroundColor
изsubViews
по какой-то причине не отображаются, возможно, они установлены прозрачными, как contentView
).Если вы не определили selectedBackgroundView
, то Какао создаст / вставит синий (или серый) градиентный фон и отобразит его для вас) backgroundView
без изменений
Когда ячейка снята, начинается анимация для удаления выделения:
- Альфа-свойство
selectedBackgroundView
анимируется с 1.0 (полностью непрозрачный) до 0.0 (полностью прозрачный). - * * * * *
backgroundView
снова не изменяется (поэтому анимация выглядит как перекрестное затухание между selectedBackgroundView
и backgroundView
) - ТОЛЬКО ОДИН РАЗ, когда анимация завершена,
contentView
перерисовываетсяв состоянии «не выбран» и его подпредставления backgroundColor
снова становятся видимыми (это может привести к тому, что ваша анимация будет выглядеть ужасно, поэтому желательно, чтобы вы не использовали UIView.backgroundColor
в своем contentView
)
ВЫВОДЫ:
Если вам требуется backgroundColor
для сохранения в течение всей анимации выделения, не используйте свойство backgroundColor
UIView
вместо этого вы можете попробовать (вероятно, с-в tableview:cellForRowAtIndexPath:
):
CALayer сцвет фона:
UIColor *bgColor = [UIColor greenColor];
CALayer* layer = [CALayer layer];
layer.frame = viewThatRequiresBGColor.bounds;
layer.backgroundColor = bgColor.CGColor;
[cell.viewThatRequiresBGColor.layer addSublayer:layer];
или CAGradientLayer:
UIColor *startColor = [UIColor redColor];
UIColor *endColor = [UIColor purpleColor];
CAGradientLayer* gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = viewThatRequiresBGColor.bounds;
gradientLayer.colors = @[(id)startColor.CGColor, (id)endColor.CGColor];
gradientLayer.locations = @[[NSNumber numberWithFloat:0],[NSNumber numberWithFloat:1]];
[cell.viewThatRequiresBGColor.layer addSublayer:gradientLayer];
Я также использовал метод CALayer.border для предоставления пользовательского UITableViewразделитель:
// We have to use the borderColor/Width as opposed to just setting the
// backgroundColor else the view becomes transparent and disappears during
// the cell's selected/highlighted animation
UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake(0, 43, 1024, 1)];
separatorView.layer.borderColor = [UIColor redColor].CGColor;
separatorView.layer.borderWidth = 1.0;
[cell.contentView addSubview:separatorView];