0

我有一个 UIViewController,它根据用户设置的频率,每 X 秒(例如 5 或 10)以 animateWithDuration 淡入/淡出显示图像。为了管理定期定时调用以淡入/淡出图像,我有一个 NSTimer,每次调用 viewWillAppear 时都会设置它。

一些执行动画的函数,我们称之为“showImageNow”:

// on...
[UIView animateWithDuration:someInterval
                      delay:0
                    options:UIViewAnimationCurveEaseInOut
                 animations:
                    ^{
                        // UI alpha = ... code here
                    }
                 // off...
                 completion:^(BOOL finished){


                     [UIView animateWithDuration:someOtherInterval
                                           delay:yetAnotherValue
                                         options:UIViewAnimationCurveEaseInOut
                                      animations:
                                        ^{
                                            // UI alpha = ... code here
                                        }
                                      completion:nil
                      ];
                 }
 ];

在视图中会出现:

if(myTimer != nil)
{
    [myTimer invalidate]; // in case user changed the frequency in settings view
}
myTimer = [NSTimer scheduledTimerWithTimeInterval: [[NSUserDefaults standardUserDefaults] doubleForKey:@"userFrequency"]
    target:self
    selector: @selector(showImageNow:)
    userInfo: nil
    repeats: YES];

在 viewDidAppear 中:

if(myTimer) { [myTimer fire]; }

虽然大部分时间一切都按预期工作,但每次 UIViewController 重新出现时,第一个动画的淡出部分都会被切断/断断续续(例如,应用程序进入后台或应用程序位于另一个视图中)。动画的淡入部分总是很奇怪。这是在真实设备上观察到的,而不是在模拟器上。所以淡入/淡出适用于除第一个动画之外的每个动画(淡出部分不起作用)。

笔记:

  • 是的,我也在 viewWillAppear(而不是 viewDidAppear)中尝试了 [myTimer fire],但这会导致其他问题,例如当用户从其他视图或后台模式切换到该视图时,UIViewController 的元素会突然出现。
  • 频率比 animateWithDuration 的动画值长得多,因此不应该有任何帧重叠或任何可能存在的 UI 重叠。
  • 我在 UIVIewController 中的每个 animateWithDuration 调用之前都放置了调试代码,因此我确定没有其他animateWithDuration 会中断第一个图像 animateWithDuration 调用。

所以这很令人困惑。我试过使用 CADisplayLink 但显然这不是正确的方法。任何想法如何解决这个问题?

4

1 回答 1

1

我会尝试UIViewAnimationOptionBeginFromCurrentState在您的动画代码中启用该选项,看看是否有帮助

于 2014-04-27T19:18:26.460 回答