Пользовательский стиль выбора UITableViewCell?
Когда я нажимаю на UITableViewCell
, фоновая часть (области, которые не покрывает фоновое изображение) становится синей, когда я нажимаю на ячейку. Кроме того, все UILabel
на ячейке становятся белыми, когда нажимаются, что я хочу.
Однако мне не нужен синий фон, когда я нажимаю на него, но если я делаю selectionstylenone
, я теряю выделенные цвета для UILabel
в ячейке.
Итак, есть ли способ просто избавиться от синего фона при щелчке ячейки, но сохранить выделенные цвета UILabel
s?
Ответы
Ответ 1
Вы можете сделать это следующим образом. Задайте стиль выбора ячейки таблицы UITableViewCellSelectionStyleNone
. Это приведет к удалению синего фона. Затем, чтобы сделать выделение текстового ярлыка таким, каким вы хотите, вместо использования класса UITableViewCell по умолчанию, создайте подкласс UITableViewCell
и переопределите стандартную реализацию setHighlighted:animated
с вашей собственной реализацией, которая устанавливает цвета ярлыков, однако вы хотите в зависимости от выделенного состояния.
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
if (highlighted) {
self.textLabel.textColor = [UIColor whiteColor];
} else {
self.textLabel.textColor = [UIColor blackColor];
}
}
Ответ 2
Если вы работаете до iOS7, не делайте стиль выбора ячейки
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Осталось, оставьте его UITableViewCellSelectionStyleDefault
Тогда:
UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView = selectedView;
Этот код будет работать правильно
Ответ 3
Вы можете использовать следующие методы делегатов после того, как вы установили стиль выбора в none:
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
Внесите свой код здесь, например
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
[cell.lbls setTextColor:[UIColor whiteColor]];
return indexPath;
}
Ответ 4
В cellForRowAtIndexPath используйте этот код:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels
Надеюсь, это сработает для вас.
Наслаждайтесь кодированием:)
Ответ 5
Чтобы получить эту работу, вы должны установить стиль выделения UITableViewCellSelectionStyleNone
, а затем вы должны переопределить метод setSelected:animated:
, чтобы получить желаемый результат. Это делает то же самое, что и механизм автоматического выбора iOS, когда вы видите синий (или серый) выбор.
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
if (selected) {
self.textLabel.textColor = [UIColor whiteColor];
} else {
self.textLabel.textColor = [UIColor blackColor];
}
}
Вы также можете настроить это по-другому, например. путем изменения фона UITableViewCell и т.д.
Ответ 6
Переопределение следующих функций в вашем подклассе UITableViewCell
.
override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }
Ответ 7
Чтобы соответствовать стандартным поведением стиля выбора, вам нужно переопределить как setHighlighted:animated:
, так и setSelected:animated:
. Вероятно, вам захочется переместить этот код в общий метод, чтобы избежать дублирования кода.
override func setHighlighted(highlighted: Bool, animated: Bool) {
setAsSelectedOrHighlighted(highlighted, animated: animated)
super.setHighlighted(highlighted, animated: animated)
}
override func setSelected(selected: Bool, animated: Bool) {
setAsSelectedOrHighlighted(selected, animated: animated)
super.setSelected(selected, animated: animated)
}
func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) {
let action = {
// Set animatable properties
}
if animated {
UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil)
}
else {
action()
}
}
Ответ 8
В вашей пользовательской ячейке переопределите стандартную реализацию awakeFromNib и setSelected:
- (void)awakeFromNib {
// Initialization code
UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds];
imageView.image = [UIImage imageNamed:@"cell_selected_img"];
self.selectedBackgroundView = imageView;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
if (selected) {
self.lblCustomText.textColor = [UIColor whiteColor];
} else {
self.lblCustomText.textColor = [UIColor blackColor];
}
}
Также убедитесь, что стиль выделения НЕ установлен на Нет.
Ответ 9
Единственный способ, с помощью которого я мог работать, - это:
- (void)awakeFromNib {
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0];
bgColorView.layer.masksToBounds = YES;
self.selectedBackgroundView = bgColorView;
}