Добавление Gradientlayer в cellForRowAtIndexPath

У меня есть таблица пользовательских ячеек. В каждой ячейке я добавляю метку в качестве подпредставления и загружаю данные в метку. Я добавляю градиент в свой cellForRowAtIndexPath для каждой ячейки внутри блока if, где мы проверяем, является ли ячейка нулевой или нет. Он работает нормально. Но теперь у меня есть дополнительное требование, и проблема начинается здесь. Мне нужно проверить значения и применить эффект градиента для определенной метки в ячейке. Вот мой код.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
   static NSString *CellIdentifier = @"Cell";
   NSNumberFormatter *formatter = [NSNumberFormatter new];
   [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    HistoryCustomCell *cell = (HistoryCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        {
             cell = [[HistoryCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;

            CAGradientLayer *gradient = [CAGradientLayer layer];
            gradient.frame = CGRectMake(cell.frame.origin.x + 2, cell.frame.origin.y, tableView.frame.size.width - 3, 44.0);
            gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:228.0/255.0 green:228.0/255.0 blue:228.0/255.0 alpha:1] CGColor], (id)[[UIColor colorWithRed:254.0/255.0 green:254.0/255.0 blue:254.0/255.0 alpha:1]CGColor], nil];
            [cell.layer insertSublayer:gradient atIndex:0];

       }

        NSMutableDictionary *dictValue = [arrHistoryValues objectAtIndex:indexPath.row];            

           tempBestEverValue = [dictValue objectForKey:@"bestEverValue"];
           tempBestValue = [dictValue objectForKey:@"bestValue"];

            cell.cell1.text = [dictValue objectForKey:@"year"];

            NSString *janValue = [dictValue objectForKey:@"janValue"];
            if ([janValue isEqualToString:@"(null)"]) {
                janValue = @"";
                cell.cell2.text = [NSString stringWithFormat:@"%@",janValue];

            }
            else
            {
                janValue = [formatter stringFromNumber:[NSNumber numberWithInteger:[janValue intValue]]];
                cell.cell2.text = [NSString stringWithFormat:@"$%@",janValue];

            }

            if ([[dictValue objectForKey:@"janBest"] isEqualToString:[dictValue objectForKey:@"janValue"]])
            {
                cell.cell2.font = [UIFont boldSystemFontOfSize:12.0];
            }
             if ([[dictValue objectForKey:@"janValue"]intValue] == [tempBestEverValue intValue])

            {
                CAGradientLayer *gradient = [CAGradientLayer layer];
                gradient.frame = cell.cell2.frame;
                gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:165.0 green:239.0 blue:156.0 alpha:1.0] CGColor], (id)[[UIColor colorWithRed:140.0 green:203.0 blue:90.0 alpha:1.0] CGColor], nil];
                [cell.layer insertSublayer:gradient atIndex:1];
            }
            else if ([[dictValue objectForKey:@"janValue"]intValue] == [tempBestValue intValue])

            {
                CAGradientLayer *gradient = [CAGradientLayer layer];
                gradient.frame = cell.cell2.frame;
                gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:173.0 green:251.0 blue:173.0 alpha:1.0] CGColor], (id)[[UIColor colorWithRed:181.0 green:255.0 blue:181.0 alpha:1.0] CGColor], nil];
                [cell.layer insertSublayer:gradient atIndex:1];
            }



            NSString *febValue = [dictValue objectForKey:@"febValue"];
            if ([febValue isEqualToString:@"(null)"]) {
                febValue = @"";
                cell.cell3.text = [NSString stringWithFormat:@"%@",febValue];

            }
            else
            {
                febValue = [formatter stringFromNumber:[NSNumber numberWithInteger:[febValue intValue]]];
                cell.cell3.text = [NSString stringWithFormat:@"$%@",febValue];

            }

            if ([[dictValue objectForKey:@"febValue"]intValue] == [tempBestEverValue intValue])

            {
                CAGradientLayer *gradient = [CAGradientLayer layer];
                gradient.frame = cell.cell3.frame;
                gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:165.0/255.0 green:239.0/255.0 blue:156.0/255.0 alpha:1.0] CGColor], (id)[[UIColor colorWithRed:140.0/255.0 green:203.0/255.0 blue:90.0/255.0 alpha:1.0] CGColor], nil];
                [cell.layer insertSublayer:gradient atIndex:1];
            }
            else if ([[dictValue objectForKey:@"febValue"]intValue] == [tempBestValue intValue])

            {

                CAGradientLayer *gradient = [CAGradientLayer layer];
                gradient.frame = cell.cell3.frame;
                gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:173.0/255.0 green:251.0/255.0 blue:173.0/255.0 alpha:1.0] CGColor], (id)[[UIColor colorWithRed:181.0/255.0 green:255.0/255.0 blue:181.0/255.0 alpha:1.0] CGColor], nil];
                [cell.layer insertSublayer:gradient atIndex:1];
            }
            if ([[dictValue objectForKey:@"febBest"] isEqualToString:[dictValue objectForKey:@"febValue"]])
            {
                cell.cell3.font = [UIFont boldSystemFontOfSize:12.0];
            }

      return cell;
}

Теперь градиент не применяется должным образом, когда я перезагружаю таблицу. Это случайный выбор ячеек и применение градиента. Как правильно удалить градиент перед перезагрузкой таблицы. Ломаю голову уже несколько дней. Пожалуйста помоги.


person nOOb iOS    schedule 10.06.2013    source источник


Ответы (2)


Я думаю, что вы не учитываете, как работают многоразовые ячейки. В какой-то момент вы добавляете градиентный слой в данную ячейку: [cell.layer insertSublayer:gradient atIndex:1];. Если вы прокрутите эту ячейку за пределы видимой области, эта ячейка позже будет повторно использована для других строк, все еще содержащих слой.

Попробуйте следующее: Всякий раз, когда вы хотите отобразить ячейку без градиентного фона, убедитесь, что возвращаемая вашим методом ячейка не содержит градиентного слоя. Используйте два разных идентификатора ячейки для двух случаев, например. @"CellIdentifier" и @"GradientCellIdentifier" и добавить слой градиента только при инициализации ячейки в последнем случае.

person Theo    schedule 10.06.2013
comment
Здесь я всегда хотел, чтобы для ячейки присутствовал градиент. И при этом для некоторых значений мне нужно применить другой цвет градиента. По этой причине я установил [cell.layer insertSublayer:gradient atIndex:0] для всех ячеек и [cell.layer insertSublayer:gradient atIndex:1] для конкретной ячейки столбца, где мне нужно показать другой цвет градиента. - person nOOb iOS; 11.06.2013
comment
На самом деле я не использую строки ячеек повторно, представление таблицы добавляется в представление прокрутки. Таким образом, все ячейки будут видны все время. - person nOOb iOS; 11.06.2013

У вас уже есть пользовательская ячейка (HistoryCustomCell), используйте ее получше.

Вместо того, чтобы добавлять слой градиента в делегат таблицы, добавьте его в пользовательский класс и сделайте его общедоступным. Теперь в делегате вы можете сделать:

cell.gradientLayer.opacity = 0;

Когда градиент не требуется и:

cell.gradientLayer.opacity = 1;
cell.gradientLayercolors = ...;

Когда требуется градиент, и вам нужно указать цвет.

person Wain    schedule 10.06.2013
comment
Я всегда хотел показать цвет градиента для всей ячейки, и при этом мне нужно показать другой цвет градиента для определенных значений. - person nOOb iOS; 11.06.2013
comment
Это нормально. Пользовательская ячейка может иметь градиент для всего фона и другой для части фона и сделать их общедоступными. Применяется тот же процесс. - person Wain; 11.06.2013