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)
在上述情况下,参考框架只是调用发生时的当前时间.
如果属于a的一部分,那么它的beginTime属性CAAnimation似乎才有效.我认为你还需要设置大到足以持续到最终动画完成的属性.CAAnimationCAAnimationGroupdurationCAAnimationGroup
| 归档时间: |
|
| 查看次数: |
5979 次 |
| 最近记录: |