Ячейки AQGridView меняются местами, когда применяется CAAnimation

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

Проблема в том, что когда начинается затухание, содержимое ячейки обычно обменивается. Например, если в первой строке сетки есть ячейки с метками "1", "2", "3", тогда метки могут быть заменены на "1", "3", "2".

- (AQGridViewCell *)gridView:(AQGridView *)aGridView cellForItemAtIndex:(**********)index
{
 static NSString *CellIdentifier = @"ReusableGridViewCell";

 AQGridViewCell *cell = (AQGridViewCell *)[gridView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil)
 {
 [[NSBundle mainBundle] loadNibNamed:@"ReusableGridViewCell" owner:self options:nil];

 cell = [[[AQGridViewCell alloc] initWithFrame:gridViewCellContent.frame
 reuseIdentifier:CellIdentifier] autorelease];
 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
 [cell.contentView addSubview:label];
 [label release];

 cell.selectionStyle = AQGridViewCellSelectionStyleNone;
 }

 UILabel *label = [[cell.contentView subviews] objectAtIndex:0];
 if (! tapped)
 {
 label.text = [NSString stringWithFormat:@"%u", index];
 } 
 else if (index > 0)
 {
 CATransition *cellAnimation = [CATransition animation];
 cellAnimation.duration = 3.0;
 cellAnimation.type = kCATransitionFade;
 cellAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
 [label.layer addAnimation:cellAnimation forKey:kCATransition]; // labels get swapped
// [cell.contentView.layer addAnimation:cellAnimation forKey:kCATransition]; // labels get swapped
// [cell.layer addAnimation:cellAnimation forKey:kCATransition]; // labels get swapped, one cell immediately disappears
 NSLog(@"%u", [gridView isAnimatingUpdates]); // prints "0"

 label.hidden = YES;
 }

 return cell;
}

- (void)gridView:(AQGridView *)aGridView didSelectItemAtIndex:(**********)index
{
 tapped = YES;
 [gridView reloadData];
}

Я попытался установить точки останова в связке методов AQGridView, AQGridViewCell и т.д., Чтобы попытаться найти тот, который вызывает своп. Не удалось найти.

В известных ошибках AQGridView есть следующее:

Не пытайтесь накладывать несколько анимаций друг на друга. т.е. не вызывайте -beginUpdates в виде сетки, метод -isAnimatingUpdates возвращает YES. Плохие вещи произойдут, клетки окажутся в неправильных местах, уложенных друг на друга.

В приведенном выше коде -isAnimatingUpdates возвращает NO. Несмотря на это, возможно, что я вижу, это еще одна связанная ошибка в AQGridView - я отправлю отчет об ошибке. Но так как мой - такой простой случай, мне интересно, встретил ли кто-нибудь его раньше и разобрался с обходным путем, возможно, каким-то образом отключить анимацию внутри AQGridView.

редактировать

Чтобы увидеть, была ли проблема связана с hidden свойством, я вместо этого анимировал непрозрачность ячейки (попробовал оба подхода, описанные здесь). Даже когда непрозрачность уменьшается до 0,5 вместо 0.0, ячейки все еще меняются.

1 ответ

Вот обходной путь. Если кто-нибудь найдет более элегантное решение, я буду отмечать его как ответ.

- (void)gridView:(AQGridView *)aGridView didSelectItemAtIndex:(**********)index
{
 // Create a copy of the 0th cell content and display it on top of that cell.
 AQGridViewCell *selectedCell = [aGridView cellForItemAtIndex:0];
 UILabel *selectedLabel = [[selectedCell.contentView subviews] objectAtIndex:0];
 CGRect frame = [self.view convertRect:selectedLabel.frame fromView:selectedLabel.superview];
 UILabel *labelOnTop = [[UILabel alloc] initWithFrame:frame];
 labelOnTop.text = selectedLabel.text;
 [self.view addSubview:labelOnTop];
 [labelOnTop release];

 // Fade away the grid view as a whole (not individual cells). 
 CATransition *cellAnimation = [CATransition animation];
 cellAnimation.duration = 3.0;
 cellAnimation.type = kCATransitionFade;
 cellAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
 [aGridView.layer addAnimation:cellAnimation forKey:kCATransition];
 aGridView.hidden = YES;
}

licensed under cc by-sa 3.0 with attribution.