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

Я разрабатываю приложение для iPhone. В моем представлении таблицы мне нужен пользовательский цвет для Cell Selection Style, я читаю UITableViewCell Class Reference, но для стиля выделения есть только три константы (синий, серый, ни один). Я видел одно приложение, которое использовало другой цвет, чем те, которые указаны в ссылке.

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

Спасибо заранее.

Ответ 1

Лучший способ установить выбор - установить 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 в нужный цвет.

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

Ответ 2

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

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

Ответ 3

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

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

    [super setHighlighted:highlighted animated:animated];
}

EDIT для iOS7: как заявила Сашо, вам также нужно

cell.selectionStyle = UITableViewCellSelectionStyleNone

Ответ 4

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

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

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

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

Ответ 5

Переопределить 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

}

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

Ответ 6

Sublcass UITableViewCell и переопределить setHighlighted:animated:

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

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

Ответ 7

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

Ответ 8

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