0

スクロールビューを高速でスクロールする場合、scrollViewDidEndDecelerating をチェックして新しいサブビューを生成するため、コンテンツが十分に速くロードされていないか、描画がスキップされているかどうかはわかりません: (より良い方法はありますか?) 高速スクロールは必要ありません! - それが引き起こす問題を解決したいだけです。

詳細な説明: コンテンツ サイズが大きく、ページングが有効なスクロール ビューがあります。特定のページに対して、フレームの起点がフレームサイズの -1、0、+1 倍の 3 つのサブビューが追加されます (したがって、中央のフレームが表示され、他のフレームは次のページと前のページになります)。フレーム -1 と +1 は ImageView で、フレーム 0 は独自の ImageView サブビューを持つ別の UIScrollView です。それらはサブクラス化されていません。

パフォーマンス上の理由から、私のアプローチは、スクロールが前方または後方に移動するかどうかを確認し、新しい画像のみをロードすることです.サブビューが追加されたら。

現在、高速スクロールにより新しい画像が表示されませんが、さらに悪いことに、プログラムはどのインデックスにあるべきか混乱してクラッシュします。小さな写真で試しましたが、同じ問題が発生しました。

ユーザーは必ずしも高速スクロールを許可されているわけではありません。ページの移動が開始されたら、読み込みが完了するまで、それ以上のスワイプ ジェスチャを無視するだけで十分でしょう。

アイデアをありがとう。

ページの読み込み:

-(void)loadSVforPage:(int)page
{
    int nextSVpage = page +1;
    int previousSVpage = page -1;
    int numberOfAssets = assets.count;

    ALAsset *displayAsset;
    ALAssetRepresentation *assetRep;
    CGFloat SVwidth = scrollLarge.frame.size.width;
    CGFloat SVheight = scrollLarge.frame.size.height;

    UIImage *tempImg1;
    UIImage *tempImg2;
    UIImage *tempImg3;
    UIImage *displayed;


    if (page != currentpage)
    {

        // if moves are +1 or -1 use temp images, else load all
        if (page == currentpage +1) // moving forward
        {
            //NSLog(@"page+");
            tempImg1 = nextSVImg;   // the former "next", which now becomes current
            tempImg3 = currentSVImg;  // the former "current", which now becomes previous

            if ((page+1 >=0) && (page+1 <= assets.count-1))  
            {
                displayAsset = [assets objectAtIndex:page+1];  // the "new next" image 
                assetRep = [displayAsset defaultRepresentation];
                tempImg2 = [ImageProcessing fullSizeImageForAssetRepresentation:assetRep];
            }
        }
        else if (page == currentpage -1) // moving backwards

        ....
        ....
        ....

        // LOAD PAGE+1 

        if (nextSVpage <= numberOfAssets-1)
        {
            displayed = tempImg2;

                nextSVImg = displayed;  // store the image for future scrolls

                CGRect frame = CGRectMake(nextSVpage * SVwidth, 0, SVwidth, SVheight);

                //old code adding UIImageViews
                //------------------------------
                //nextScrollImageView = [[UIImageView alloc]initWithFrame:frame];
                //[completeScrollableImageView addSubview:nextScrollImageView];
                //nextScrollImageView.image = displayed;

                // new code with subclassed UIView and image in drawRect
                //-------------------------------
                scrollUIViewNext = [[scrollviewImage alloc]initWithFrame:frame andImage:displayed];
                [completeScrollableImageView addSubview:scrollUIViewNext];

                ....
                ....
                ....

トリガー負荷:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    if (scrollView.tag == 0)  // the base SV
    {
        int pageNumber = floor(scrollView.contentOffset.x / scrollView.frame.size.width + 0.5);//+1;
        if (pageNumber != currentpage)
        {
            //NSLog(@"moved from current %i to %i",currentpage,pageNumber);
            [self loadSVforPage:pageNumber];
        }
    } 
}
4

0 に答える 0