Как я могу связать базовые анимации для разных слоев один за другим?

у меня есть scrollView с включенным разбиением на страницы и количество страниц N, которые являются UIViews как подпредставления scrollView.

Я пытаюсь сделать следующее:

Пользователь прокручивает страницу до n. На этом этапе 7 CALayers, которые были ранее добавлены к странице номер n (то есть к странице [[scrollView subviews] objectAtIndex: n-1] .layer subLayers]) постепенно появляются, одно за другим.

Но я не могу понять, как заставить CALayers плавно переходить в последовательный поток. До сих пор я пробовал следующие 3 подхода из метода делегирования моего контроллера: (предположим, что у меня есть массив слоев, и их непрозрачность была установлена ​​на 0 при создании)

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
  int pageNumber = floor(self.scrollView.contentOffset.x / self.scrollView.frame.size.width);
  if(pageNumber == (n-1))
  {
    int timeOffset = 0;

    [CATransaction begin];
    for(CALayer *layer in layerArray)
    {
      CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"opacity"];
      a.duration = 6;
      a.beginTime = timeOffset++;
      a.fromValue = [NSNumber numberWithFloat:0.];
      a.toValue = [NSNumber numberWithFloat:1.];

      [layer addAnimation:a forKey:nil];
    }
    [CATransaction commit];
  }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
  int pageNumber = floor(self.scrollView.contentOffset.x / self.scrollView.frame.size.width);
  if(pageNumber == (n-1))
  {
    int timeOffset = 0;

    [CATransaction begin];
    for(CALayer *layer in layerArray)
    {
      CABasicAnimation *a = [CABasicAnimation animation];
      a.duration = 6;
      a.beginTime = timeOffset++;
      [layer addAnimation:a forKey:@"opacity"];
      [layer setOpacity:1];
    }
    [CATransaction commit];
  }
}


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
  int pageNumber = floor(self.scrollView.contentOffset.x / self.scrollView.frame.size.width);
  if(pageNumber == (n-1))
  {
    int timeOffset = 0;


    for(CALayer *layer in layerArray)
    {
      [CATransaction begin];
      CABasicAnimation *a = [CABasicAnimation animation];
      a.duration = 6;
      a.beginTime = timeOffset++;
      [layer addAnimation:a forKey:@"opacity"];
      [layer setOpacity:1];
    }

    for(CALayer *layer in layerArray)
      [CATransaction commit];
  }
}

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

Есть идеи?

10
задан SaldaVonSchwartz 3 February 2012 в 01:58
поделиться