2012-06-02 5 views
0

У меня есть функция, которая выглядит примерно так:Почему cellForRowAtIndexPath иногда добавляет gradientLayer?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// instantiate the cell 

if(indexPath.row >=4 && indexPath.row <=5) 
{ 
[CustomTableCell addGradient]; 
} 
} 

Так в основном, только строки 4 и 5 должны иметь градиент фона. Когда табличное представление сначала загружается, строки только строки с 0 по 4 видны и не имеют градиентного фона, который является идеальным. Когда я немного прокручиваю вниз, чтобы увидеть строки 4 и 5, на них появляется градиент, что отлично. но когда я прокручиваю назад до первой строки, я вдруг вижу градиент в первой строке !!! Но я никогда не просил строку 0 иметь градиент! Кроме того, когда я немного прокручиваю, я вижу градиенты, применяемые к некоторым строкам, а не к другим. Почему это происходит?

вот функция addGradient упаковывают полезно:

- (void) addGradient 
{ 
    if([self.layer.sublayers count] >0) 
    { 
     if([[self.layer.sublayers objectAtIndex:0] isKindOfClass:[CAGradientLayer class]]) 
      return; 
    } 

    CAGradientLayer *gradient = [CAGradientLayer layer]; 
    gradient.frame = self.bounds; 

    gradient.colors = [NSArray arrayWithObjects:(id)[UIColor blueColor].CGColor, (id)[UIColor redColor].CGColor, nil]; 

    [self.layer insertSublayer:gradient atIndex:0]; 
} 

ответ

0

Я просто понял, что iPhone/какао фактически повторно используя существующую ячейку памяти для cellForRowAtIndexpath рисовать клетки, которые появляются на экране. Вот почему ячейка по-прежнему имеет слой градиента, который я задал раньше. Поэтому я обновил функцию стиля, чтобы удалить слой, если он существует, используя этот код:

- (void) styleCell 
{ 
    if([self.layer.sublayers count] >0) 
    { 
     if([[self.layer.sublayers objectAtIndex:0] isKindOfClass:[CAGradientLayer class]]) 
     { 
      [[self.layer.sublayers objectAtIndex:0] removeFromSuperlayer]; 
//   return; 
     } 
    } 

    CAGradientLayer *gradient = [CAGradientLayer layer]; 
    gradient.frame = self.bounds; 

    gradient.colors = [NSArray arrayWithObjects:(id)[UIColor blueColor].CGColor, (id)[UIColor redColor].CGColor, nil]; 


    [self.layer insertSublayer:gradient atIndex:0]; 
} 
@end 
Смежные вопросы