0

私は誰かが私のためにこのコードを説明してくれるのではないかと思っていたので、実際にそれから学ぶことができます。アプリに(インターネットからの)大量の画像を左から右にスクロールするスクローラーを持たせようとしていますが、遅延読み込みが必要です。だから私はいくつかのチュートリアルを行い、それを行う方法を理解しましたが、私はそれを本当に理解していません。だから私は、ある種の魂が遅延読み込みの方法を段階的に説明してくれることを望んでいました

これは私がチュートリアルから学んだコードです:

-(void)scrollViewDidScroll:(UIScrollView *)myScrollView {
/**
 *  calculate the current page that is shown
 *  you can also use myScrollview.frame.size.height if your image is the exact size of your scrollview
 */
int currentPage = (myScrollView.contentOffset.y / currentImageSize.height);

// display the image and maybe +/-1 for a smoother scrolling
// but be sure to check if the image already exists, you can do this very easily using tags
if ( [myScrollView viewWithTag:(currentPage +1)] ) {
    return;
}
else {
    // view is missing, create it and set its tag to currentPage+1
}

/**
 *  using your paging numbers as tag, you can also clean the UIScrollView
 *  from no longer needed views to get your memory back
 *  remove all image views except -1 and +1 of the currently drawn page
 */
for ( int i = 0; i < currentPages; i++ ) {
    if ( (i < (currentPage-1) || i > (currentPage+1)) && [myScrollView viewWithTag:(i+1)] ) {
        [[myScrollView viewWithTag:(i+1)] removeFromSuperview];
    }
}

}

4

3 に答える 3

1

scrollViewでの遅延読み込みについては、代わりにUITableViewを使用することを強くお勧めします。Appleは、このコンポーネントのパフォーマンスで素晴らしい仕事をしました。

それらを水平にすることができ(このEasyTableViewコードを参照、これはうまく機能します)、継続的なスクロールが必要な場合はページモードを停止して(pagingEnabled = NO;)、探している動作を取得できるようになります。

于 2012-08-01T08:31:50.703 に答える
0

遅延読み込みとは、基本的に、必要な場合にのみ大きなデータ(この例では画像など)をフェッチすることです。コードには、UIScrollViewをスクロールするときに呼び出されるデリゲートメソッドがあります。

-(void)scrollViewDidScroll:(UIScrollView *)myScrollView関数は、実際にデータを取得するタイミングを決定します。したがって、スクロールすると、スクロールビューのどこにいるかがわかります(たとえば、ロードする画像が10個ある場合、画面に現在画像番号1、2、3などが表示されているかどうかを確認します)。これは、currentPage整数が保持するものです。

表示しているページがわかったので、実際に画像を取得します。

if ( [myScrollView viewWithTag:(currentPage +1)] ) {
    return;
}

上記のコードは、人が現在見ている画像の後に画像が存在するかどうかをチェックします(したがって、currentPage + 1)。もしそうなら、私たちはすでにそれをフェッチしていて、関数を終了します。さもないと:

else {
    // view is missing, create it and set its tag to currentPage+1
}

ここでは、画像を遅延読み込みします。これは、たとえば、新しいスレッドを作成し、サーバーからイメージをダウンロードすることによって行われます。これは、ユーザーがスクロールしているときに画像が「ポップイン」されないようにするため、ビューがcurrentPageではないときに行います。画像を追加するビューにはタグが付けられます(UIViewには「tag」プロパティがあります)。タグをcurrentPage+1に設定します。これにより、後で必要になった場合にビューにインデックスを付けることができます。

最後に、次のようになります。

/**
*  using your paging numbers as tag, you can also clean the UIScrollView
*  from no longer needed views to get your memory back
*  remove all image views except -1 and +1 of the currently drawn page
*/
for ( int i = 0; i < currentPages; i++ ) {
    if ( (i < (currentPage-1) || i > (currentPage+1)) && [myScrollView viewWithTag:(i+1)] )         {
        [[myScrollView viewWithTag:(i+1)] removeFromSuperview];
    }
}

ここでは、currentPage変数を使用し、設定したタグでインデックスを作成して、すべてのビューを反復処理します。タグがcurrentPageから1つ離れていない場合(ポップインは必要ないことを忘れないでください!)、スクロールビューからタグを削除し、メモリを解放します。

お役に立てば幸いです。

于 2012-08-01T04:39:36.653 に答える
0

おそらくこれはあなたを助けるでしょう。

  1. ここhttps://github.com/nicklockwood/AsyncImageView/から非同期ImageViewファイルをダウンロードし、プロジェクトに含めます。

  2. xibファイルのImageViewをドラッグし、そのクラスをUIImageViewではなくAsynchronousImageViewに変更します

  3. これをあなたの.hファイルに書いてください

    IBOutlet AsynchronousImageView * _artworkImg;

  4. これを.mファイルに書き込んでください

    [_artworkImg loadImageFromURLString:@ "Your Image Url"];

于 2012-08-01T08:18:45.603 に答える