1

在我的 Xcode 项目中,我在 xib 上贴了一个标签。

我想不断地淡入淡出标签,直到用户点击屏幕。发生这种情况时,我希望出现一个新视图。

谁能建议如何进行淡入/淡出?

4

5 回答 5

8

UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat您可以使用选项对告诉 Core Animation 您希望标签连续淡入淡出,而不是嵌套块和手动重新启动动画。

- (void)startAnimatingLabel
{
    self.label.alpha = 0;

    [UIView animateWithDuration:1
                          delay:0
                        options: UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
                     animations:^{
                         self.label.alpha = 1;
                     } completion:nil];
}

要停止动画运行,只需将它们从标签层中移除即可。

- (IBAction)tap:(UITapGestureRecognizer *)sender
{
    [self.label.layer removeAllAnimations];
    self.label.alpha = 0;

    [self presentNewView];
}

编辑:完成的一种不那么突然的方法是从当前视图状态动画到最后一个(这将中断当前的重复动画)。

- (IBAction)tap:(UITapGestureRecognizer *)sender
{
    [UIView animateWithDuration:1
                          delay:0
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         self.label.alpha = 0;
                   } completion:^(BOOL finished){
                         [self presentNewView];
                   }];
}
于 2013-07-24T02:17:40.930 回答
5

您可以将一对链式动画放在一个循环中,或者每次都调用一个保存链式动画的函数,直到遇到用户点击。

通过链式动画,我的意思是这样的(您可以设置动画持续时间以满足您的需要):

myLabel.alpha = 0.0;
[UIView animateWithDuration:1.0
                      delay:0.0
                    options: UIViewAnimationCurveEaseOut
                 animations:^{
                     myLabel.alpha = 1.0;
                 } 
                 completion:^(BOOL finished){
                      [UIView animateWithDuration:1.0
                                            delay:1.0
                                           options: UIViewAnimationCurveEaseOut
                              animations:^{
                                     myLabel.alpha = 0.0;

                              }  
                 completion:^(BOOL finished){
                     NSLog(@"Done!");
                         }];
                 }];

上面的代码将首先淡入你的标签,然后淡出。你可以把它放在一个函数中并调用它,直到你遇到用户点击。

于 2013-07-24T01:53:15.603 回答
2

创建一个CABasicAnimation并将其添加到您的标签:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.fromValue = @(1.0f);
animation.toValue = @(0.1f);
animation.repeatCount = INFINITY;
animation.duration = 0.75;
animation.autoreverses = YES;

[label.layer addAnimation:animation];

当您单击按钮时,只需获取指向该标签的指针并删除所有动画:

[label.layer removeAllAnimations];
于 2013-07-24T03:03:45.717 回答
0

试试这个,如果您用重复计数替换INFINITY ,它可以让您管理动画重复计数

fadingLabel.alpha = 1.0;
[UIView beginAnimations:@"fadingLabel" context:nil];
[UIView setAnimationDuration:4.0];
[UIView setAnimationRepeatCount:INFINITY];

fadingLabel.alpha = 0.0;
[UIView setAnimationBeginsFromCurrentState:YES];

[UIView commitAnimations];
于 2014-02-24T12:24:41.283 回答
0

韦恩哈特曼在 Swift 4 中的回答

let animation = CABasicAnimation(keyPath: "opacity")
animation.fromValue = 1
animation.toValue = 0.1
animation.duration = 0.75
animation.repeatCount = .infinity
animation.autoreverses = true
label.layer.add(animation, forKey: nil)

label.layer.removeAllAnimations()
于 2019-02-03T06:30:09.770 回答