ios - UIScrollView动画问题

标签 ios multithreading uiscrollview objective-c-blocks block

我使用的是水平 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/

相关文章:

ios - iOS 中的 Unicode 文件名

objective-c - 更改 UIBarButtonItem 的宽度

iphone - 将 RootviewController 更改为导航 Controller

ios - 在 Storyboard中使用 UIScrollView 时如何保持布局完整性?

ios - ScrollView 中的 Refreshcontrol 无法快速工作

ios - 获取当前页面

ios - 如何使用 Swift 检测我的代码是否在 WatchKit 或 iOS 上运行?

java - 在线程之间传递工作项 (Java)

java - 在静态 block 中初始化线程?

java - 如何调试 JVM 中的挂起线程?