如何将不同图层的核心动画链接到一个接一个?

Sal*_*rtz 10 core-animation calayer ios

我有一个启用了分页的scrollView和N个页面,它们是UIViews作为scrollView的子视图.

我正在尝试执行以下操作:

用户滚动到页码n.此时,之前添加到页码n的7个CALayers(即,页面[[scrollView子视图] 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];
  }
}
Run Code Online (Sandbox Code Playgroud)

但似乎都不起作用.当用户滚动到右侧页面时,所有图层立即变为可见,没有太多淡入淡出,并且绝对不按任何顺序排列.

有任何想法吗?

Sal*_*rtz 18

实际上,关键是根据参考帧获得当前时间并将任何时间偏移添加到当前时间.这也适用于未分组的动画.

例如,沿着这段代码的某些东西会导致n层(假设存储在某个数组中)依次逐渐淡入,每个层花费0.8秒:

CGFloat timeOffset = 0;

[CATransaction begin];

for (CALayer *layer in layers) {
    CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"opacity"];

    a.fromValue = @(0);
    a.toValue = @(1);
    a.fillMode = kCAFillModeForwards;
    a.beginTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil] + timeOffset;
    a.duration = 0.8;
    a.removedOnCompletion = NO;

    [layer addAnimation:a forKey:nil];

    timeOffset += a.duration;
}

[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

在上述情况下,参考框架只是调用发生时的当前时间.


rob*_*off 5

如果属于a的一部分,那么它的beginTime属性CAAnimation似乎才有效.我认为你还需要设置大到足以持续到最终动画完成的属性.CAAnimationCAAnimationGroupdurationCAAnimationGroup

/sf/answers/39444051/