0

背景:

まず、背景。3ページ(0、1、2)の幅のUIScrollViewを使用して「無限スクロールビュー」を作成し、スクロールされていないときにUIScrollViewが常にページ1の中央に配置されるようにしました。ページ0またはページ2のいずれかにスクロールし、UIScrollViewDelegateがスクロールの終了を検知すると、3つのページすべてのコンテンツが最初にスクロールした方向に切り替わり、次にUIScrollViewが即座にページ1に戻り、効果をシミュレートします。無限のページストリームをスクロールし続けることができます。

最初は、UITextViewを使用して各ページのテキストコンテンツを表示していましたが、テキストのスタイル設定に関しては、すぐにもっと柔軟なものが必要になりました。したがって、表示したいスタイル付きHTMLコンテンツを含むNSStringをロードするUIWebViewを使用することになりました。これは完璧に機能し、私が望んでいたとおりに機能しました。

問題:

当然、UITextViewに静的テキストをロードするよりも、UIWebViewに単純なHTMLページをロード、解析、および表示するのに時間がかかります。このため、どの方向にスクロールしても、スクロールビューが自動的に戻り、ページのコンテンツが切り替わると、新しいコンテンツが表示される前に、古いコンテンツを10分の1秒間ヒントすることができます。

私の解決策(それはうまくいきませんでした):

ドキュメントでUIWebViewDelegateを検索したところ、ページの読み込みが完了するとイベントが発生することがわかりました。私はこれを行うためにこれを接続しました:

  1. ユーザーは1ページから2ページにスクロールします。
  2. UIScrollViewDelegateはscrollViewDidEndDeceleratingを呼び出し、ページ1にそのコンテンツを現在ページ2に表示されているのと同じコンテンツに切り替えるように指示します。
  3. ページ1のUIWebViewDelegateはwebViewDidFinishLoadを呼び出し、UIScrollViewにページ1に戻ってから、ページ0と2のコンテンツを切り替えるように指示します。

私の頭の中では、これでこの問題は解決しますが、それでもまだ十分ではないようです。したがって、私はあなたに助けを求めます。何か案は?私はすべてのメソッドにNSLogを持っていて、それらが呼び出されていることを確認したことを言及する価値があるかもしれません。他にご不明な点がございましたら、お気軽にお問い合わせください。

前もって感謝します!

UIScrollViewを含むViewController:

    // Sense when the UIScrollView stops accelerating
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)sender {
        if(pScrollView.contentOffset.x > pScrollView.frame.size.width) {
            [self switchToNextPost];
        } else if (pScrollView.contentOffset.x < pScrollView.frame.size.width) {
            [self switchToPreviousPost];
        }
    }

    // Update the currentPost variable and switch page 1
    - (void)switchToNextPost {
        [prefs setInteger:[[self getNextKey:nil] intValue] forKey:@"currentPost"];

        [self loadPostWithKey:[self getCurrentKey] atPage:[NSNumber numberWithInt:1] withViewController:currentPage];
    }

    // Update the currentPost variable and switch page 1
    - (void)switchToPreviousPost {
        [prefs setInteger:[[self getPreviousKey:nil] intValue] forKey:@"currentPost"];

        [self loadPostWithKey:[self getCurrentKey] atPage:[NSNumber numberWithInt:1] withViewController:currentPage];
    }

    // Custom delegate function. Scrolls UIScrollView to page 1 and then loads new content on page 1 and 3
    - (void)webViewFinishedLoading {
        [pScrollView scrollRectToVisible:CGRectMake(pScrollView.frame.size.width, 0, pScrollView.frame.size.width, pScrollView.frame.size.height) animated:NO];

        [self loadPostWithKey:[self getPreviousKey:nil] atPage:[NSNumber numberWithInt:0] withViewController:previousPage];
        [self loadPostWithKey:[self getNextKey:nil] atPage:[NSNumber numberWithInt:2] withViewController:nextPage];
    }


UIScrollViewに個別のページとして表示されているサブビューのViewController

    // The delegate shown in previous code
    - (void)webViewDidFinishLoad:(UIWebView *)webView {
        [[self delegate] webViewFinishedLoading];
    }
4

1 に答える 1

1

あなたにできることは、私が思うに、

  1. 最初から 3 つのページすべてに関連するコンテンツを入力します.. (おそらく既に行っているでしょう)...
  2. スクロールを開始すると、スクロールすると次の (または前の) ページが表示されます。
  3. スクロールが終了したら、既に行っているようにスクロール コンテンツ ビューを中央に移動し、各 Web ビューのテキストを変更する代わりに、ビューのフレームを変更して、関連する Web ビュー (つまり、スクロールした 1 人のユーザー) が中央に残るようにします。 、および他の2つは両側で調整されます
  4. 両方の Web ビュー (表示されない) のコンテンツを変更して、次のスクロール移動の準備が整うようにします。

高速スクロールの場合、これはまだ失敗します..しかし、コンテンツのロードに遅延があるため、どのアプローチでもそこにファイルされるため(私は思う)、おそらくすべてのWebビューを空白にして(何もロードしない)、次の場合にアクティビティインジケータを表示できます高速スクロール..

于 2011-07-26T13:10:28.883 に答える