有条件地(取决于持续时间)在iOS中的UI活动期间显示活动指示符

时间:2013-02-01 14:01:58

标签: iphone ios ipad uiscrollview uiactivityindicatorview

我使用UIScrollView显示PDF文件。水平滚动会更改页面。这样可以正常工作,但是当下一页是完整大小的图像时,滚动视图会在开始为滚动设置动画之前卡住。这是正常行为。

我希望在持续时间超过例如时显示活动指示符一秒钟,以改善对用户的反馈。

我已经尝试过启动计时器的天真方式,在一秒钟后启动指示器。它没有显示,我假设它在与活动(更改页面)相同的线程上排队,这需要很长时间。我也尝试使用performSelectorOnMainThread来启动指标,但这是一个微弱的猜测并没有帮助。

我对iOS中线程的理解是这里的问题。我只能猜测,我必须中断页面更改,执行活动指示器的开始,然后继续更改(呈现)页面。我不知道该怎么做。我很欣赏。

1 个答案:

答案 0 :(得分:0)

我猜您的计时器不会触发,因为您在调用performSelectorOnMainThread方法或安排NSTimer时使用默认的运行循环模式。它不起作用,因为在这种情况下,您的方法将在滚动完成后调用,即在释放手指后调用。

即使在滚动期间使用NSRunLoopCommonModes作为运行循环模式,也可以使计时器触发。

[self performSelectorOnMainThread:@selector(yourMethod)
                       withObject:nil
                    waitUntilDone:NO
                            modes:@[NSRunLoopCommonModes]];

修改

您不应该阻止主线程,否则在主线程完成加载图像之前不会调用该方法。而是在后台线程中加载图像,并通过实现委托方法阻止滚动视图滚动。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
  if([self isLoadingImage]){
    //save the content offset when you start loading the image
    //and use it here to stop scroll view from scrolling.
    scrollView.contentOffset = offsetWhenLoadingStarted;
  }
}