重复 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的主要内容,如果未能解决你的问题,请参考以下文章
使用animate.css [编辑]在第一个动画后重复相同的动画6s
发生 uiscrollview 事件时未触发 NSTimer