我有一个 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 但显然这不是正确的方法。任何想法如何解决这个问题?