我使用的是水平 UIScrollView,它在屏幕的前半部分显示照片。 (想象一个 CGRect (0,0,320,120)。第一个 scrollView 嵌入在第二个 scrollview 中,它占据了所有屏幕。当我向下滚动页面(因此第二个 scrollView)时,第一个 scrollview 停止动画。我编写了一个 NSTimer在第一个 UIScrollView 中每 3 秒更改一次照片,但是当我滚动第二个 scrollView 时,动画似乎正在排队。当我松开屏幕上的手指时,照片转换很少(即:2 次更改,如果我不停地滚动了 6 秒)。简而言之:我如何在滚动第二个 scrollView 时使用 block (或其他东西)来继续我的动画?
我的 NSTimer(在 viewDidLoad 中):
timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(changePage:) userInfo:nil repeats:YES];
最佳答案
您的 iOS 应用有一个运行循环,可以持续检查用户输入等内容。如果它正忙于检测触摸事件,则不会执行在该运行循环上安排的事情。 (类似地,如果您阻塞了主线程,例如一个大的服务器请求,您将不会在这段时间内获得触摸事件)。
以下是在正确的运行循环中获取 NSTimer 的方法:
首先,使用 timerWithTimeInterval:target:selector:userInfo:repeats:
创建一个未安排在运行循环上的计时器。
其次,使用 - (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
在运行循环中安排定时器。对于模式参数(运行循环类型),使用 NSRunLoopCommonModes
允许定时器触发而无需等待主运行循环。
请注意,同样的效果存在于例如performSelectorAfterDelay
如果在主运行循环中完成。它也适用于动画完成 block 。除了使用 CoreAnimation 之外,我不确定是否有解决动画完成 block 问题的简单方法。
关于ios - UIScrollView动画问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12946434/