UITableViewCell с пользовательским фоном градиента, с другим градиентом, как цвет выделения

У меня есть пользовательский UITableViewCell с настраиваемым макетом. Мне нужен градиентный фон, поэтому в моем методе cellForRowAtIndexPath: UITableViewDelegate я создаю CAGradientLayer и добавляю его на уровень ячейки с помощью insertSubLayer: atIndex: (используя индекс 0). Это прекрасно работает, за исключением двух вещей:

Самое главное, я не могу понять, как изменить цвет другого градиента при подсвечивании строки. Я пробовал пару вещей, но я просто недостаточно знаком с каркасом, чтобы заставить его работать. Где было бы идеальным местом для размещения этого кода, внутри делегата таблицы или самой ячейки?

Кроме того, между каждой ячейкой таблицы есть 1px пробел. У меня цвет фона на главном экране, цвет фона на столе и цвет фона на ячейке. Есть ли какие-либо дополнения или разделители по умолчанию в UITableView?

Ответ 1

Я знаю, что эта ветка устарела, но вот решение для первой части вашего вопроса (добавление градиента к выбранным и невыбранным состояниям ячейки):

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{    
    [cell setBackgroundColor:[UIColor clearColor]];

    CAGradientLayer *grad = [CAGradientLayer layer];
    grad.frame = cell.bounds;
    grad.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];

    [cell setBackgroundView:[[UIView alloc] init]];
    [cell.backgroundView.layer insertSublayer:grad atIndex:0];

    CAGradientLayer *selectedGrad = [CAGradientLayer layer];
    selectedGrad.frame = cell.bounds;
    selectedGrad.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];

    [cell setSelectedBackgroundView:[[UIView alloc] init]];
    [cell.selectedBackgroundView.layer insertSublayer:selectedGrad atIndex:0];
}

Ответ 2

Я не уверен в первом вопросе, но думаю, вы можете установить свойство selectedBackgroundView аналогично тому, как вы устанавливаете свойство backgroundView. Пустое пространство между ячейками, вероятно, является разделителем. Вы можете изменить этот цвет, например

tableView.separatorColor = [UIColor redColor];

Ответ 3

Я много дней боролся с этим. Решение оказалось довольно простым, но различные части головоломки были распределены по нескольким различным ответам и сайтам. Недостатком части головоломки оказалось различие между представлением контента и фоном и при котором применяется цвет выбора.

Особенности моего решения:

  • Я загружаю свою ячейку из наконечника, чтобы я мог компоновать содержимое в IB. Не стесняйтесь размещать контент программно.
  • Я получаю градиентные цвета от объекта глобального стиля, потому что мне нужно настроить градиент по клиенту.
    • Я установил цвет выделения ячейки в серый, чтобы по умолчанию (синий) не столкнулся с моей цветовой схемой.
  • Я добавляю градиенты к фону. Если вы этого не сделаете, цвет выбора не отображается правильно. UITableViewCell по умолчанию не имеет фонового представления, поэтому сначала его нужно создать.

Этот последний пункт был секретным ингредиентом, который заставлял все это работать для меня.

Я добавил метод factory в мой подкласс UITableCellView, потому что я хотел использовать одну и ту же ячейку в нескольких таблицах.

+(ActivityDetailCellView *) createWithStyle: (WMStyle *) style {  
  UIViewController *temporaryController = [[UIViewController alloc] 
       initWithNibName: @"ActivityDetailCellView"
       bundle: nil];

  ActivityDetailCellView *cell = (ActivityDetailCellView *) temporaryController.view;

  CAGradientLayer *lightGradient = [CAGradientLayer layer];
  lightGradient.frame = cell.bounds;
  lightGradient.colors = style.lightGradient;

  UIView *background = [[UIView alloc] initWithFrame: cell.bounds];
  [background.layer insertSublayer:lightGradient atIndex:0];  
  cell.backgroundView = background;

  return cell;
}