我有一个 UILabel,它显示滚动视图的当前视图的当前日期。当我将此视图向左滚动(向左页面)时,我希望此标签更改为前一天,并在两个日期之间产生交叉效果。

我参考了滚动到 Spotlight 页面时 Springboard 的淡入淡出效果。我认为这很相似,但我不知道如何实现它!

我应该把代码放在哪里,我是否必须使用 2 个不同的 UILabel 或者 CoreAnimation ?我什么时候更改日期?

提前致谢 !

有帮助吗?

解决方案

  1. 在你的 scrollViewDidScroll: 委托方法,检查滚动视图是否 contentOffset 表示用户已经滚动到另​​一个页面。
  2. 如果是这样,请将标签文本更改为新日期。它还不会动画,但在尝试动画之前请先执行此操作。
  3. 对于动画,添加一个 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 更改而更改它们的不透明度值。

其他提示

使用的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];
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top