スクロールビューで約100ページを表示する必要があり、各ページには8つの画像ビューと8つのラベルが含まれています。画像ビューの画像は遅延してロードする必要があります。私が作成したサンプルは画像を怠惰にロードし、ページ付けも問題ありませんが、各ページに8つの画像ビューと8つのラベルが含まれる100ページすべてをロードしています..シミュレーターでは正常に動作しますが、怖いのでデバイスでテストしていません一度に非常に多くのビューをロードしているときにクラッシュするのを確認します。誰かが私を助けたり、ビューを再利用したり、imageviewの遅延読み込みを実行したりするのに役立つサンプルを案内してくれますか?
4 に答える
私はお勧めしますUIPageViewController
、これはそれを実装する方法の良いチュートリアルです。
つまり、ページにすべての画像とラベルを表示する1つのコントローラーがあるので、次のページに移動すると、別のコントローラーを起動して画像を設定するだけで、前のページもメモリから削除されます。すべてのページはページコントローラーのインスタンスによって表され、UIPageViewControllerが担当します。必要がなければ、ページカールアニメーションを実行する必要はありません。
もちろん、スクロールビューでページ上のすべてのアイテムの位置を計算し、のページ付けを使用してアイテムを移動したり、他の画像を読み込んだりUIScrollView
できますが、数百ページある場合は、使用しないのはなぜUIPageViewController
ですか?
ちなみに、チュートリアルも必要ありません。iOSテンプレートから作成して、コードをに移動するだけですPage Based Application
。Model Controller
DataViewController
で画像の遅延読み込みを行う方法を説明している投稿UIScrollViewと遅延読み込みUIScrollView
をご覧ください。
UIScrollView
これはまさに、探している遅延読み込みのステップバイステップのイントロです。
アイデアは次のとおりです。たとえば、現在、前のビュー、次のビューの3つのビューをメモリに保持します。そのため、遅滞なく次または前の1つに移動できます。1つの新しいビューに移動するときは、前のビューと次のビューをロードします(必要な場合)。重要な機能として高速スクロールを使用する場合は、メモリ内のビューの数を5または7に増やす必要があります。メモリ内に保持するビューが多いほど、シームレスなスクロールが可能になりますが、料金は高くなります。メモリ使用量の。
デバイスのメモリがいっぱいになり、アプリが強制終了されるため、すべてのビューをメモリに保持することはお勧めしません。いずれの場合も、デバイスがメモリ内のこれらすべてのビューを同時に処理できるかどうかを試してみることができます。
検討する可能性のある興味深いオプションの1つは、ページの読み込み中にアクティビティインジケーターを表示することです。これにより、ビューが読み込まれますが、スクロールがより自然に感じられます。
あなたのファイルを見て、私が気づいたことの1つは
for (int i =0; i<loopTimes; i++)
でloadImagesForPage
。
そのメソッドを分割して、1回の実行で実行されないようにすることができます(その間、UIをブロックします)。つまり:
for (int i =0; i<loopTimes; i++) {
[self performSelector:@selector(loadSingleImageForPage:)
withObject:[NSNumber numberWithInt:i]
afterDelay:0.0];
}
ここloadSingleImageForPage:
で、はforループの現在の本体をカプセル化するメソッドです。このように(つまり、を使用してafterDelay
)1ページをロードし、実行ループに戻ります。次に次のものを実行して、実行ループに戻ります。実行ループに戻ると、システムにUIを処理したり、呼び出しを委任したりする機会が与えられます。
これが違いを生むことを願っています。それ以外の場合、私の提案はコードの一部をコメントアウトしようとしているだけです(つまり、画像をダウンロードしようとせずにプレースホルダーのみを表示するときにアプリが正しく機能するかどうかを確認するなど)。
編集(2013年7月9日)
上記のリンクは死んでいるように見えるので、ここにコードがあります:
1-次のように、デリゲートでscrollViewDidScrollをリッスンします。
-(void)scrollViewDidScroll:(UIScrollView *)myScrollView {
}
2-画像の既知のサイズを使用して現在のページを計算します。
/**
* 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);
3-画像がすでに存在するかどうかを確認し、存在しない場合は追加します。
// 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
}
4-そしてあなたの記憶をきれいにすることを忘れないでください:
/**
* 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];
}
}
5-そしてすべてのステップの最後の組み合わせ:
-(void)scrollViewDidScroll:(UIScrollView *)myScrollView {
int currentPage = (myScrollView.contentOffset.y / currentImageSize.height);
if ( [myScrollView viewWithTag:(currentPage +1)] ) {
return;
}
else {
// view is missing, create it and set its tag to currentPage+1
}
for ( int i = 0; i < currentPages; i++ ) {
if ( (i < (currentPage-1) || i > (currentPage+1)) && [myScrollView viewWithTag:(i+1)] ) {
[[myScrollView viewWithTag:(i+1)] removeFromSuperview];
}
}
}
他の人もいれば、 VSScrollerで利用できる私のクラスを調べることができます
UITableViewのようにセルの再利用性を実装する単純なUIScrollViewサブクラスを作成しました。プロジェクト、MMHorizontalListViewはgitHubにあり、テストプロジェクトもあるので、例で使用方法を確認できます。4.xなどの古いiOSバージョンでも機能します。 (おそらくもっと古い...)