1

我尝试了很多不同的选项,并查看了大约 15 个堆栈答案,但我无法弄清楚这一点。

代码基本上是试图淡出,然后每次点击时弹出一个视图。它第一次工作正常,但以后不会工作。

- (void)handleTap:(UIGestureRecognizer*)gestureRecognizer
{
    self.view.transform = CGAffineTransformIdentity;

    __block HelpScreenController* weakSelf = self;
    [UIView animateWithDuration:10
                      delay:0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^(void) {
                     weakSelf.view.alpha = 0;
                 }
                 completion:^(BOOL finished) {
                     if (finished) {
                         weakSelf.view.alpha = 100.0f;
                         [weakSelf.view.layer removeAllAnimations];
                         [weakSelf.view setNeedsDisplay];
                     }
                 }];

}

它在第一次点击时完美运行 - 它在 10 秒内从不透明平滑过渡到完全透明。Second+ tap(s) 它会在那里停留 10 秒,然后变成透明的心跳,然后又回到完全不透明的状态。

我怎样才能让它每次都能流畅地制作动画?

提前致谢!

4

2 回答 2

3

alpha值介于0.0f和之间1.0falpha将完成块中的值设置为1.0f而不是100.0f应该可以解决问题。

因为大于 的值1.0f都是完全不透明的,所以你不会看到从100.0fto的过渡1.0f(动画的 99%),所以从1.0fto过渡的有效持续时间0.0f大约是 0.1 秒而不是 10 秒(不完全是,因为动画曲线,但你明白了)。

于 2013-04-26T04:37:17.580 回答
2

您可以只使用 CABasicAnimation 代替。尝试这样的事情:

- (void)handleTap:(UIGestureRecognizer*)gestureRecognizer
{
   CALayer *viewLayer = self.view.layer;
   [viewLayer removeAllAnimations];
   CABasicAnimation *fader = [CABasicAnimation animationWithKeyPath:@"opacity"];
   fader.fromValue = [NSNumber numberWithFloat:0.0];
   fader.toValue = [NSNumber numberWithFloat:1.0];
   fader.duration = 10;//change the duration and autoreverses option to fit with your look
   fader.autoreverses = YES;
   fader.repeatCount = 0;
   [viewLayer addAnimation:fader forKey:@"fadeAnimation"];
}

希望能帮助到你!

于 2013-04-26T04:46:03.440 回答