0

UISCrollView が 1 次元だけでなく、1 方向のスクロールのみを受け入れるようにする必要があります。ScrollView には、水平方向のプレイリスト内の曲のアルバム アートが含まれています。ページ付きですので、表紙ごとにページがあります。ユーザーがカバーを左にスワイプまたはドラッグすると、次のカバーが所定の位置にスライドし、次の曲が再生されます。

前の曲やカバーに戻ることはできません。この動作を防ぐにはどうすればよいですか?

私は次のことを試しました:

- (void)scrollViewDidScroll:(UIScrollView *)scrolledView
{
    if(scrollView.contentOffset.x < (pageIndex * 320) - 320)
        [scrollView setContentOffset:CGPointMake((pageIndex * 320) - 320, 0)];
}

しかし、「前」の方向にすばやくスライドすると、カバーが「次の」方向に約 150px スライドします。

また、removeFromSuperview を使用して以前のカバーを削除しようとしましたが、これは黒いスペースを残すだけで、ドラッグは引き続き実行できます。

最後に、カバーを移動しようとしました:

-(void) reloadCoverScrollView{
    for(int i = 1; i < [scrollView.subviews count]; i++){
        [scrollView exchangeSubviewAtIndex:i withSubviewAtIndex:i - 1];
    }
    [scrollView setNeedsDisplay];
}

どうすればやりたいことを達成できますか? ScrollView は、常に最初のページにあるかのように動作する必要があります。ありがとう。

4

1 に答える 1

1

次の 2 つのオプションがあります。

  1. 独自のカスタム ビューを構築する
  2. 現在のページをオフセット 0 に移動して、スクロールビューの動作を変更します。

両方のソリューションについて説明します。

** カスタム ビュー (スクロール ビューなし) * ここで必要なのは、便利なスクロール ビュー機能のほとんどが削除されたスクロール ビューです。ページ)。私の意見では、2 つのビューをインスタンス化するビュー コントローラーを作成する必要があります。1 つは現在のビューで、もう 1 つは次のビューです。現在のビューが表示され、次のビューはウィンドウのすぐ外側に配置されます。次に、1 本の指でパンするジェスチャを追加し、そのステータスを追跡することによって (これは継続的なジェスチャです)、最初のビューの上に 2 番目のビューをスライドさせることができます。スワイプが完了したと判断したら、アニメーションを終了します。アニメーションの最後に、新しいページを「最初」として設定し、非表示の 2 番目のページを次のビューでレンダリングします。

**スクロールビューを使い続ける**

このような場合、UIScrollView デリゲートとして動作するビュー コントローラーは、表示されるページがコンテンツ オフセット 0 に配置されるように動作する必要があります。たとえば、ページ 0 から開始し、スクロール ビューにページ 1、ページ 2、... のリストがあるとします。ページ 1 にスワイプしてアニメーションが終了するとすぐに、ページ 1 からすべてのビューを翻訳します。左に 1 ページ分 (つまり、ページの幅が 320px の場合、すべてのサブビューを左に 320px 翻訳します)、ページ 0 のサブビューを削除します。次に、スクロール ビューのコンテンツ オフセットを原点 (0, 0)。したがって、最後に、新しいページ 1 が位置 0 に設定され、ページ 2 が位置 1 に移動されます。左にスクロールすることはできず、右にしかスクロールできません。「removeFromSuperview」を使用した場合

于 2012-09-11T12:30:20.463 に答える