Как установить для свойства UITableViewCellSelectionStyle какой-либо другой цвет? - PullRequest
35 голосов
/ 04 ноября 2008

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

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

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

Ответы [ 9 ]

64 голосов
/ 17 апреля 2009

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

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

24 голосов
/ 04 декабря 2009

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

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

12 голосов
/ 24 июля 2012

Если вы создали подкласс 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
7 голосов
/ 22 июля 2012

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

- (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: Я предлагаю использовать метод touchesCancelled, чтобы вернуться к исходным цветам ячеек, но просто игнорируйте метод touchesEnded.

2 голосов
/ 04 ноября 2008

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

}

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

1 голос
/ 25 октября 2012

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];
}
0 голосов
/ 05 февраля 2018

Чтобы добавить собственный цвет, используйте код ниже. И чтобы сделать его прозрачным, используйте 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)
}
0 голосов
/ 29 июня 2016
- (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;
}
0 голосов
/ 04 июля 2013
- (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];  
  }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...