0

UIScrollViewを使用してPDFファイルを表示します。水平方向にスクロールすると、ページが変わります。これは正常に機能しますが、次のページがフルサイズの画像の場合、スクロールのアニメーション化を開始する前にスクロールビューが動かなくなります。これは正常な動作です。

ユーザーへのフィードバックを改善するために、期間が1秒を超える場合にアクティビティインジケーターを表示したいと思います。

私はすでに1秒後にインジケーターを開始するタイマーを開始する素朴な方法を試しました。表示されません。非常に時間がかかるUIアクティビティ(ページの変更)と同じスレッドでキューに入れられていると思います。また、インジケーターを開始するためにperformSelectorOnMainThreadを使用しようとしましたが、それは弱い推測であり、役に立ちませんでした。

iOSでのスレッド化についての私の理解は、ここでの問題です。ページの変更を中断し、アクティビティインジケーターの開始を実行してから、ページの変更(レンダリング)を続行する必要があると推測できます。どうすればいいのかわかりません。よろしくお願いします。

4

1 に答える 1

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;
  }
}
于 2013-02-01T16:11:27.923 に答える