重复 NSTimer 会导致在第一个动画上截断 animateWithDuration

Posted

技术标签:

【中文标题】重复 NSTimer 会导致在第一个动画上截断 animateWithDuration【英文标题】:Repeating NSTimer causes truncated animateWithDuration on first animation 【发布时间】:2014-04-27 18:42:58 【问题描述】:

我有一个 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 重新出现时,first 动画的淡出部分都会被切断/断断续续(例如,应用程序进入后台或应用程序在另一个视图中)。动画的淡入部分总是很奇怪。这是在真实设备上观察到的,而不是在模拟器上观察到的。所以淡入/淡出适用于除第一个动画之外的每个动画(淡出部分不起作用)。

注意事项:

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

所以这很令人困惑。我试过使用 CADisplayLink 但显然那是not the right way to do it。任何想法如何解决这个问题?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我试过 [UIView animateWithDuration:interval2 delay:interval1 options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionBeginFromCurrentState 动画:......但它似乎没有工作......(虽然它现在在启动时很好,但切换到其他一些视图并切换回它会导致相同的口吃第一个动画(后续动画仍然很好,不过)。 嗯,让我再试验一下……性能似乎有些随机。 显然,如果我将所有 NSTimer 无效/重置/更新代码移动到 viewDidAppear,并将其与 UIViewAnimationOptionBeginFromCurrentState 结合起来,它就可以工作。

以上是关于重复 NSTimer 会导致在第一个动画上截断 animateWithDuration的主要内容,如果未能解决你的问题,请参考以下文章

NSTimer 导致崩溃

Eclipse 调试上的变量查看器会截断字符串值 [重复]

使用animate.css [编辑]在第一个动画后重复相同的动画6s

发生 uiscrollview 事件时未触发 NSTimer

发生 uiscrollview 事件时未触发 NSTimer

IOS中定时器NSTimer的开启与关闭