gpt4 book ai didi

ios - 我怎样才能一个接一个地链接不同层的核心动画?

转载 作者:技术小花猫 更新时间:2023-10-29 10:58:52 30 4
gpt4 key购买 nike

我有一个启用了分页的 scrollView 和 N 个页面,它们是作为 scrollView 的 subview 的 UIView。

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

用户滚动到第 n 页。此时,之前添加到第 n 页的 7 个 CALayer(即到页面 [[scrollView subviews] objectAtIndex:n-1].layer subLayers])一个接一个淡入。

但我不知道如何让 CALayers 依次淡入。到目前为止,我已经从我的 Controller 的委托(delegate)方法中尝试了以下 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];
}
}

但似乎都不起作用。当用户滚动到正确的页面时,所有层立即变得可见,没有太多淡入淡出,而且绝对不是按任何顺序排列。

有什么想法吗?

最佳答案

实际上,关键是根据引用系获取当前时间,并向当前时间添加任何时间偏移量。这也适用于非分组动画。

例如,这段代码中的某些内容会导致 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];

在上面的例子中,引用系就是调用发生的当前时间。

关于ios - 我怎样才能一个接一个地链接不同层的核心动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9122756/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com