2

大きな画像を含む UIScrollView があり、ページングを使用して画像間をスクロールしています。メモリを節約するために、現在表示されている画像の前後に 1 つの画像のみを読み込み、スクロールが完了した後に新しい画像を読み込み/解放しています。この問題は、スクロールが速く、scrollViewDidEndDecelerating が呼び出されない場合に発生します。scrollViewDidEndDecelerating が呼び出されたときに、アクティブなページに画像名を表示したかったのです。

これを解決するにはどうすればよいですか?なぜこれが起こるのですか?

4

5 に答える 5

0

私はスクロールビューで同じことをしています - 画像の遅延ロード。実際には、引き伸ばされたサムネイルをロードして (画像のぼやけた低解像度バージョンを作成)、ページが実際に 100% 表示されているときに実際の画像をロードする必要がありました。

私がしなければならなかったのは、scrollViewDidScroll:scrollView で次のコードを使用することでした。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{    
    if (!_isCurrentlyRotating) {
        CGFloat pageWidth = _scrollView.frame.size.width;
        int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth)+1;

        if (_currentPage != page)
            [self setCurrentPage:page];
    }
}

上記は、(スクロールとして)表示されるページを計算します。ページ ビューが 50% 表示されると、実際には現在のページ番号が変更されます。これをページ コントロールと組み合わせて使用​​すると、現在のページ ドットを強調表示できます。

上記を使用して (スクロール ビューでページングを有効にして)、ユーザーが指を使用してページを変更すると (通常の動作)、ページが 100% 表示されると scrollViewDidEndDecelerating:scrollView が呼び出されます。100% とは、別のページの一部ではなく、1 つのページのみを表示できることを意味します。

しかし、スクロール ビューの最後に、私の scrollToPage: 関数を呼び出す「やり直す」ボタンがあります。

- (void) scrollToPage:(int)page {
    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * page;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;
    [self.scrollView scrollRectToVisible:frame animated:YES];
}

scrollRectToVisible:animated: メソッドを使用しても scrollViewDidEndDecelerating: メソッドはトリガーされないため、ユーザーがスクロールした場合、またはやり直すボタンが押されました。

- (void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
    [self sharpenImageView];
}

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    [self sharpenImageView];
}

これが役立つことを願っています!

于 2012-01-19T21:10:58.260 に答える
-1

scrollViewDidEndDecelerating:スクロール ビューの にscrollViewDidScroll:基づいて、現在表示されているページを実装して計算する必要があります。contentOffset表示範囲が変更された場合は、以前表示されていなかったページのビューを追加し、表示されなくなったページを削除します。

于 2011-07-18T00:49:13.363 に答える