Как установить для свойства UITableViewCellSelectionStyle какой-либо пользовательский цвет?

Я разрабатываю приложение для iPhone, в моем табличном представлении мне нужен пользовательский цвет для стиля выделения ячеек, я прочитал Описание класса UITableViewCell, но для стиля выделения определены только три константы (синий, серый, нет). Я видел одно приложение, в котором использовались цвета, отличные от тех, что указаны в справочнике.

Как мы можем использовать цвет, отличный от указанного в справочнике?

Заранее спасибо.

Я настоятельно рекомендую подход Мэтта Галлахера вместо того, который вы приняли! Пожалуйста, подумайте о том, чтобы посмотреть, если вы еще этого не сделали.

Adam Alexander 10.12.2009 21:22

Ответ в этом посте так запутан. Пожалуйста, игнорируйте самые высокие оценки и идите голосовать за правильные ответы, которые указаны внизу.

bentford 25.10.2012 18:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
35
2
27 070
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Переопределите didSelectRowAtIndexPath: и нарисуйте UIView цвета по вашему выбору и вставьте его за UILabel внутри ячейки. Я бы сделал это примерно так:

UIView* selectedView; //inside your header

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

  UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
  selectedView = [[UIView alloc] initWithFrame:[cell frame]];
  selectedView.backgroundColor = [UIColor greenColor]; //whatever

  [cell insertSubview:selectedView atIndex:0]; //tweak this as necessary
  [selectedView release]; //clean up

}

Вы можете выбрать анимацию этого вида, когда он будет отключен и будет соответствовать вашим требованиям.

Этот подход позволяет избежать использования встроенного в Apple selectedBackgroundView на каждом UITableViewCell. Если вы используете selectedBackgroundView, ваш выбор будет анимироваться, а также будет отменен, когда будет указано.

Matt Gallagher 18.05.2009 15:51

Было бы лучше переопределить setSelected:highlighted: в ячейке и выполнить там логику, если вы собираетесь использовать этот подход, чтобы он работал во всех контроллерах представления. Как сказал Мэтт, использование selectedBackgroundView - гораздо лучший подход.

Sam Soffes 27.08.2010 02:22
Ответ принят как подходящий

Лучший способ установить выбор - установить selectedBackgroundView в ячейке, когда вы ее создаете.

т.е.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
        cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground.png"]] autorelease];
    }

    // configure the cell
}

Используемое изображение должно иметь красивый градиент (например, выбор по умолчанию). Если вам просто нужен плоский цвет, вы можете использовать UIView вместо UIImageView и установить backgroundColor на нужный вам цвет.

Этот фон затем автоматически применяется при выборе строки.

А как насчет сгруппированных представлений таблиц стилей? Я просто использовал прямоугольное изображение, и оно просвечивало через закругленные кривые ячеек tableview. +1 за отличный ответ.

JoePasq 04.12.2009 05:14

Для сгруппированных ячеек табличного представления вам нужно 4 фона - верхний, нижний, средний, верхний и нижний, и вам нужно применять их в зависимости от того, где находится ячейка в группе.

Matt Gallagher 08.12.2009 03:17

Вы не можете сделать это без использования изображений?

ingh.am 11.03.2010 19:51

@ james.ingham: вы можете использовать любой вид для selectedBackgroundView. Вы можете использовать обычный UIView и установить плоский backgroundColor. Вы можете использовать специально нарисованный подкласс UIView. Вы не можете просто установить другой оттенок; это не может быть сделано.

Matt Gallagher 14.03.2010 04:08

должен выполнить автоматический выпуск для selectedBackgroundView, чтобы он не протекал.

stigi 12.04.2010 14:06

Это верно только наполовину. Он будет отображаться только тогда, когда ячейка выбрана, а не во время нажатия. См. Ответ Уилстера для решения.

bentford 25.10.2012 18:23

Настройка selectedBackgroundView кажется неэффективной, если для cell.selectionStyle установлено значение UITableViewCellSelectionStyleNone. Когда я не устанавливаю стиль, используется серый цвет по умолчанию.

Использование первого предложения, которое вставляет пользовательский UIView в ячейку, действительно манипулирует ячейкой, но он не отображается при касании ячейки, только после завершения выбранного действия, что слишком поздно, потому что я нажимаю на новое представление. Как сделать так, чтобы выбранное представление в ячейке отображалось до начала выбранной операции?

Это правильно. Мне нужно установить selectionStyle на Blur или Gray. Никто не заставит это работать. В любом случае вы можете сделать это, переопределив метод -setHighlited:animated: класса UITableViewCell.

eonil 30.11.2011 15:12

Я пробовал кое-что из вышеперечисленного и На самом деле я предпочитаю создать свой собственный подкласс UITableViewCell, а затем переопределить методы touchesBegan / touchesCancelled / touchesEnded. Для этого игнорируйте все свойства selectedBackgroundView и highlightedColor в ячейке, а вместо этого просто устанавливайте эти цвета вручную при каждом вызове одного из вышеперечисленных методов. Например, если вы хотите установить для ячейки зеленый фон с красным текстом, попробуйте следующее (в своем подклассе пользовательской ячейки):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //Set backgorund
    self.backgroundColor = [UIColor themeBlue];

    //Set text
    self.textLabel.textColor = [UIColor themeWhite];

    //Call super
    [super touchesBegan:touches withEvent:event];
}

Обратите внимание, что для этого вам необходимо установить:

self.selectionStyle = UITableViewCellSelectionStyleNone;

В противном случае вы сначала получите текущий стиль выделения.

Обновлено: Я предлагаю использовать метод touchesCancelled, чтобы вернуться к исходным цветам ячеек, но просто игнорируйте метод touchesEnded.

Если вы создали подкласс UITableViewCell, вы можете настроить различные элементы ячейки, переопределив следующее:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    if (highlighted) {
        self.backgroundColor = [UIColor redColor];
    } else {
        self.backgroundColor = [UIColor clearColor];
    }

    [super setHighlighted:highlighted animated:animated];
}

РЕДАКТИРОВАТЬ для iOS7: как сказал Сашо, вам также нужно

cell.selectionStyle = UITableViewCellSelectionStyleNone

В iOS 7 вышеуказанное решение работало в сочетании с «cell. SelectionStyle = UITableViewCellSelectionStyleNone».

Sasho 09.03.2014 17:29

Подкласс UITableViewCell и переопределить setHighlighted:animated:

Вы можете определить собственный цвет выбора цвета, установив backgroundColor (см. Ответ Виллстера):

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    if (highlighted) {
        self.backgroundColor = [UIColor redColor];
    } else {
        self.backgroundColor = [UIColor clearColor];
    }

    [super setHighlighted:highlighted animated:animated];
}

Вы можете определить собственное фоновое изображение, установив свойство backgroundView:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    if ( highlighted == YES )
        self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_default.png"]];
    else
        self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_active.png"]];


    [super setHighlighted:highlighted animated:animated];
}
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {  
// Set Highlighted Color  
if (highlighted) {  
self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f];
    } else {  
        self.backgroundColor = [UIColor clearColor];  
  }   
}

UITableViewCell имеет метод для установки цвета выделенного состояния. Здесь спиннет кода // выполняет анимацию между обычным и выделенным состоянием

PK86 04.07.2013 16:01
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // Add your Colour.
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    [self setCellColor:Ripple_Colour ForCell:cell];  //highlight colour
}

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // Reset Colour.
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    [self setCellColor:Ripple_Colour ForCell:cell]; //normal color

}

- (void)setCellColor:(UIColor *)color ForCell:(UITableViewCell *)cell {
    cell.contentView.backgroundColor = color;
    cell.backgroundColor = color;
}

Чтобы добавить собственный цвет, используйте приведенный ниже код. А для прозрачности используйте alpha: 0.0

cell.selectedBackgroundView = UIView(frame: CGRect.zero)
cell.selectedBackgroundView?.backgroundColor = UIColor(red:0.27, green:0.71, blue:0.73, alpha:1.0)

Если вы используете собственный цвет и хотите придать ему вид с закругленными углами, используйте:

cell.layer.cornerRadius = 8

Кроме того, используйте это для лучшей анимации и ощущения

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    tableView.deselectRow(at: indexPath, animated: true)
}

Другие вопросы по теме