【问题标题】:Can Scrolling control an Animation?滚动可以控制动画吗?
【发布时间】:2010-02-08 16:58:18
【问题描述】:
我有一个 UILabel,它显示我的滚动视图当前视图的当前日期。当我将此视图滚动到左侧(左侧页面)时,我希望此标签更改为前一天,并在两个日期之间产生交叉效果。
当您滚动到 Spotlight 页面时,我将 Springboard 的褪色效果作为参考。我认为这很相似,但我不知道如何实现它!
我将代码放在哪里,我必须使用 2 个不同的 UILabel 还是 CoreAnimation ?我什么时候更改日期?
提前致谢!
【问题讨论】:
标签:
iphone
core-animation
uilabel
transition
fading
【解决方案1】:
- 在您的
scrollViewDidScroll: 委托方法中,检查滚动视图的contentOffset 是否指示用户已滚动到另一个页面。
- 如果是这样,请将标签的文本更改为新日期。它还不会制作动画,但请在尝试制作动画之前执行此操作。
-
对于动画,将CATransition 添加到标签层并根据自己的喜好进行配置:
// Create a transition animation and add it to the label's layer:
CATransition *transition = [CATransition animation];
transition.type = kCATransitionFade;
transition.duration = 0.25;
[self.dateLabel.layer addAnimation:transition forKey:@"textTransition"];
// Change the label's text as before:
self.dateLabel.text = newDateString;
这种效果与 Springboard 图标的淡化有点不同(因为当您进一步滚动到 Spotlight 页面时,这些图标会不断淡化),但我认为我的方法更适合您的应用程序。要模拟 Springboard 效果,您确实应该使用两个单独的标签(具有相同的框架)并随着滚动视图的 contentOffset 的变化而更改它们的不透明度值。
【解决方案2】:
使用带有两个标签的核心动画就可以了。默认情况下,更改 Core Animation 层的属性会导致平滑过渡,因此您可以利用它来发挥自己的优势。例如:
- (void)crossfadeDateLabels
{
date1Label.layer.opacity = 0.0f;
date2Label.layer.opacity = 1.0f;
}
如果您想要更多控制,也可以使用显式动画模型:
- (void)crossfadeDateLabels
{
CABasicAnimation *date1Anim = [CABasicAnimation animationWithKeyPath:@"opacity"];
date1Anim.duration = 1.0f;
date1Anim.fromValue = [NSNumber numberWithFloat:1.0f];
date1Anim.toValue = [NSNumber numberWithFloat:0.0f]
// Do something similar for date2Anim...
[date1Label.layer addAnimation:date1Anim forKey:nil];
[date2Label.layer addAnimation:date2Anim forkey:nil];
}