Спеціальний стиль вибору UITableViewCell?


82

Коли я натискаю на UITableViewCell, фонова частина (області, які моє фонове зображення не охоплює) стає синьою, коли я натискаю на клітинку. Крім того, всі UILabels на клітині стають білими, коли на них клацають, що я хочу.

Однак мені не потрібен синій фон, коли я натискаю його, але якщо я це роблю selectionstylenone, то я втрачаю виділені кольори для UILabels у клітинці.

Тож чи є спосіб просто позбутися синього фону, коли клікне клітинка, але зберегти виділені кольори UILabels?


Відповіді:


174

Ви можете зробити це наступним чином. Встановіть для стилю вибору комірки таблиці значення 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];
    }
}

11
В якості примітки, переконайтеся , що ви перевизначення setHighlighted:animated:, який приймає animatedпараметр. Перевизначення setHighlighted:методу одного параметра не буде працювати.
Імре Келені

14
Чи варто дзвонити [super setHighlighted:highlighted animated:animated];?
SoftDesigner

Дуже дякую! Працює як шарм! І це дасть мені контроль над виділенням іншого користувацького перегляду в комірці, якщо я хочу, тому що стандартне підсвічування робить це дивно.
imike

2
Але цей метод має одну проблему, коли ви замінюєте setHighlightedі setSelected. Спочатку ви вибираєте клітинку, гаразд, колір textColor змінюється на білий, потім ви прокручуєте цю клітинку з візуальної частини екрана, потім прокручуєте назад, бачите, textColor стає чорним
ronan

1
@jonkroll Я зрозумів концепцію, але моя вимога полягає в тому, що коли вибирається комірка, тоді колір textLabel цієї комірки повинен залишатися як selectedColor, зараз він просто змінює колір textLabel під час виділення, після чого виділений текст Етикетка залишається в оригінальному кольорі
Самарт Кейрівал,

75

Якщо ви працювали до iOS7, не використовуйте стиль вибору комірки

cell.selectionStyle = UITableViewCellSelectionStyleNone;

В іншому, залиште це UITableViewCellSelectionStyleDefault

Тоді:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

Цей код буде працювати належним чином


2
@iBradApps ... тут ви не створюєте жодного користувацького класу ... комірки ui tableview
Alfa

2
Надання цього позитивного голосу - це єдине рішення, яке для мене спрацювало для зміни нетекстового кольору вибраної комірки в iOS 7.
Верн Дженсен,

1
selectionstyle should be selectionStyle
braden

12
Це рішення працювало на iOS7, але лише після того, як я встановив selectionStyle на UITableViewCellStyleDefault.
Jay Q.

1
Цей метод є єдиним методом, який абсолютно ідентично поведінці вибору комірок Apple "з коробки". Слід прийняти відповідь.
mkll

16

Ви можете використовувати наступні методи делегування після того, як не встановите для стилю виділення значення 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;
}

1
Чудове і чисте рішення! Вам потрібно лише реалізувати виклик willDeselectRowAtIndexPath, і він працює як магія!
Matej Balantič

1
Можливим недоліком тут є те, що цей метод не викликається, поки ваш палець не покине вибрану клітинку; деякі інші підходи набувають чинності, як тільки ви торкаєтесь клітини.
arlomedia

14

Щоб отримати цю роботу, вам потрібно встановити стиль виділення, 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 тощо.


13

У cellForRowAtIndexPath використовуйте такий код:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

Сподіваюся, це буде працювати для вас.

Насолоджуйтесь кодуванням :)


Ця відповідь повинна бути зверху. :)
Chintan Patel

2
Це не працює. Якщо ви хочете зробити [cell.textLabel setHighlightedTextColor: [UIColor blueColor]]; Вибір комірки Стиль не повинен бути НІЯКИМ.
Феміна

6

Перевизначення наступних функцій у вашому підкласі UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }

Дякую; це єдине, що не спричиняє виділення цілого рядка від лівого краю екрана до правого при зміні кольору фону.
Хосе Рамірес

Я лише перевизначував setSelected, саме тому з якихось причин клітина все ще іноді блимала.
Zonily Jame

3

Для того, щоб відповідати стандартній поведінці стилю вибору, вам потрібно замінити обидва 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()
    }
}

1

У вашій користувацькій комірці перевизначте реалізацію 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];
    }
}

Крім того , переконайтеся , що стиль вибору буде НЕ встановлений в None .


0

Єдиний спосіб, як я міг змусити його працювати, був:

- (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;
}

0

Також ви можете використовувати contentView.alpha. Ось приклад.

Спочатку встановіть стиль виділення для своєї комірки:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Далі, у власному класі комірок перевизначте цей метод за допомогою прикладу анімації:

  - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        [UIView animateWithDuration:0.15f animations:^{
            self.contentView.alpha = 0.5f;
        }];
    } else {
        [UIView animateWithDuration:0.35f animations:^{
            self.contentView.alpha = 1.f;
        }];
    }
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.