【问题标题】:Repeating NSTimer causes truncated animateWithDuration on first animation重复 NSTimer 会导致在第一个动画上截断 animateWithDuration
【发布时间】: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。任何想法如何解决这个问题?

【问题讨论】:

    标签: objective-c nstimer animatewithduration


    【解决方案1】:

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

    【讨论】:

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