web-dev-qa-db-ja.com

iOSでuiscrollviewを無限にするにはどうすればよいですか?

そのようにスクロールしたい1 2 3 1 2 3

無限スクロールで表示したい10個のボタンがあると思います。

 numbercolors=[[NSMutableArray alloc] init];

 //total count of array is  49 

 numbercolors = [NSMutableArray arrayWithObjects:@"25",@"26",@"27",@"28",@"29",@"31",@"32",@"33",@"34",@"35", @"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",@"18",@"19",@"20",@"21",@"22",@"23",@"24",@"25",@"26",@"27",@"28",@"29",@"30",@"31",@"32",@"33",@"34",@"35", @"0",@"1",@"2",@"3",nil];

  int x=2500;

for (NSInteger index = 0; index < [numbercolors count]; index++)
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    button.frame = CGRectMake(x ,0,29.0,77.0);

    button.tag = index;

    [button setTitle:[numbercolors objectAtIndex:index] forState:UIControlStateNormal];

    [button addTarget:self action:@selector(didTapButton:) 

    forControlEvents:UIControlEventTouchUpInside];

    [coloringScroll addSubview:button];

    x=x+70+29;
}
 [coloringScroll setContentSize:CGSizeMake(5000+ (29+70)*[numbercolors count], 1)];

 [coloringScroll setContentOffset:CGPointMake(2500+(29+70)*11, 0)];

これは、scrollviewでbutttonを作成するための私のコードです。

設定方法-(void)scrollViewDidEndDecelerating:(UIScrollView *)無限スクロールのためにこのメソッドを送信します。

15
virantporwal

SetContentOffsetカウントを設定するだけです

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.x > 2500+(29+70)*4 + ((29+70)*36)) {
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x-((29+70)*36),  0)];  
    }
    if (scrollView.contentOffset.x < 2500+(29+70)*4){
       [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x+((29+70)*36), 0)];
    }
}
8
virantporwal

主なアイデアは、スクロールビューを一定の値に再配置し、ある値までスクロールした後、「1」、「2」、「3」のアイテムを正しく自動配置することです。

例-contentwidth 5000のscrollviewがあります。デフォルトでは、位置2500に設定します。

次に、単に- (void)scrollViewDidCScroll:(UIScrollView *)scrollviewをチェックインします-scrollview.contentoffset.x> 3500の場合-その位置をscrollview.contentoffset.x-= 1000に減らします。

反対側についても同じです。これにより、無限スクロールが発生します。

しかし、コンテンツは続きません。したがって、「1」、「2」、「3」の項目を正しく並べ替えて再配置するには、追加のコンテンツオフセット値チェックを実装する必要があります。

私は通常3つの要素を使用し、必要なギャラリー画像を動的にプリロードします。

「ホイール」を作り直したくない場合は、次の解決策を確認してください。

https://www.cocoacontrols.com/controls/dmcircularscrollview

https://www.cocoacontrols.com/controls/infinitescrollview

https://www.cocoacontrols.com/controls/iainfinitegridview

7

この解決策は、Apple StreetScroller iOSサンプルコードに基づいて確認できます。

https://github.com/gblancogarcia/GBInfiniteScrollView

お役に立てば幸いです。

このタスクを実行する無限ローリングUIscrollViewサブクラスを作成しました。これは、Apple StreetScrollerサンプルに基づいています。ボタンのタイトルと、水平スクロールか垂直スクロールかを指定するだけです。他の多くのオプションを設定することもできます。ドキュメントと私のgithubのサンプルプロジェクトです。ここにリンクがあります...

http://github.com/ninefifteen/SSRollingButtonScrollView

2
ninefifteen

これは古い質問ですが、同じ解決策を探している人を助けるためにこれを書いています。 3つのアイテム(セル)-C0、C1、C2を無限にループしたいとします。中央のセルの左側と右側にダミーセルを生成できます。結果は次のようになります。

C0 C1 C2 [C0 C1 C2] C0 C1 C2

括弧内のセルは、デバイスの画面から見えるセルです。左にスクロールすると、

C0 [C1 C2 C0] C1 C2 C0 C1 C2

この時点で、contentOffsetが所定のダミーセルの右側を指すように強制します。

C0 [C1 C2 C0] C1 C2 C0 C1 C2-> C0 C1 C2 C0 [C1 C2 C0] C1 C2

これをシームレスに実装するには時間がかかるので、以下の解決策をお勧めします。

https://github.com/DragonCherry/HFSwipeView

動作を確認したい場合は、下のリンクをクリックして「タップして再生」してください。

https://www.cocoacontrols.com/controls/hfswipeview

1
DragonCherry

右無限スクロールの場合は、次を使用できます-

        let rightOffset = CGPoint.init(x: (scrollView.contentSize.width) - (scrollView.bounds.width), y: 0)
    UIView.animate(withDuration: 3.0,
                   delay: 0.0,
                   options: [.curveLinear, .repeat],
                   animations: { () -> Void in
                    self.scrollView.contentOffset = rightOffset

    }, completion: { (finished: Bool) -> Void in
        self.scrollView.setContentOffset(.init(x: 0, y: self.scrollView.contentOffset.y), animated: false)
    })
0
niku

Swiftに無限スクローラーを実装しました。
これはApple StreetScroller の例に触発されています

私はまだ完璧ではないことを知っていますが、私は神の出発点だと思います。

InfiniteVerticalScroller

0
Luca Davanzo

ここで提供される答えは良いですが、それでも満足できない場合、ここで別のアプローチを探すことは私がやったことです。

主なアイデアは、最後のセルの前のセルに到達するたびにセルの数を更新することです。アイテムの数を1つ増やすたびに、無限スクロールのように見えます。これを行うには、scrollViewDidEndDecelerating(_ scrollView: UIScrollView)関数を使用して、ユーザーがスクロールを終了したことを検出し、コレクションビューの項目数を更新します。これを実現するためのコードスニペットを次に示します。

class InfiniteCarouselView: UICollectionView {

    var data: [Any] = []

    private var currentIndex: Int?
    private var currentMaxItemsCount: Int = 0
    // Set up data source and delegate
}

extension InfiniteCarouselView: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // Set the current maximum to a number above the maximum count by 1
        currentMaxItemsCount = max(((currentIndex ?? 0) + 1), data.count) + 1
        return currentMaxItemsCount

    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        let row = indexPath.row % data.count
        let item = data[row]
        // Setup cell
        return cell
    }
}

extension InfiniteCarouselView: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: collectionView.frame.height)
    }

    // Detect when the collection view has finished scrolling to increase the number of items in the collection view
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        // Get the current index. Note that the current index calculation will keep changing because the collection view is expanding its content size based on the number of items (currentMaxItemsCount)
        currentIndex = Int(scrollView.contentOffset.x/scrollView.contentSize.width * CGFloat(currentMaxItemsCount))
        // Reload the collection view to get the new number of items
        reloadData()
    }
}

長所

  • 簡単な実装
  • Int.maxを使用しない(私の意見では、これは良い考えではありません)
  • 任意の数を使用しない(50などのように)
  • データの変更または操作なし
  • コンテンツオフセットやその他のスクロールビュー属性を手動で更新しない

短所

  • ページングを有効にする必要があります(ページングをサポートしないようにロジックを更新できます)
  • 一部の属性(現在のインデックス、現在の最大数)の参照を維持する必要がある
  • 各スクロールの端でコレクションビューを再読み込みする必要があります(表示されるセルが最小限の場合は、それほど問題ではありません)。キャッシュなしで非同期に何かをロードしている場合、これはあなたに大きな影響を与える可能性があります(これは悪い習慣であり、データはセルの外にキャッシュされるべきです)
  • 両方向に無限スクロールしたい場合は機能しません
0
Santina