Ячейки AQGridView меняются местами при применении CAAnimation - PullRequest
1 голос
/ 12 декабря 2011

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

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

- (AQGridViewCell *)gridView:(AQGridView *)aGridView cellForItemAtIndex:(NSUInteger)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:(NSUInteger)index
{
    tapped = YES;
    [gridView reloadData];
}

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

В известных ошибках AQGridView есть это:

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

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

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

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

1 Ответ

1 голос
/ 12 декабря 2011

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

- (void)gridView:(AQGridView *)aGridView didSelectItemAtIndex:(NSUInteger)index
{
    // Create a copy of the 0th cell's 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;
}
...