15

UIScrollView で「循環」スクロールを作成しようとしていますが、失敗しました。

私がしたいこと: uiscrollview が最後に達した場合、uiscrollview が最初に移動して戻った場合、最初に移動する必要があります。

私の状況では、スクロールビューを追加するのは良い方法ではありません(他の方法では「ページID」を取得する必要があります)

何かアイデアはありますか?

4

4 に答える 4

42

このメソッドを実装しましたが、ページングを有効にする必要があります。5 つの要素があるとしますA,B,C,D and E。ビューを設定するときは、次のように、最後の要素を最初に追加し、最初の要素を最後に追加し、コンテンツ オフセットを調整して最初の要素を表示しますE,[A],B,C,D,E,A。UIScrollViewDelegate で、ユーザーがいずれかの端に到達したかどうかを確認し、アニメーションなしでオフセットをもう一方の端に移動します。

[ ] が表示されているビューを示していると想像してください。

E,A,B,C,[D],E,A

ユーザーが右にスワイプ

E,A,B,C,D,[E],A

ユーザーが右にスワイプ

E,A,B,C,D,E,[A]

次に、コンテンツ オフセットを 2 番目の要素に自動的に設定します。

E,[A],B,C,D,E,A

このようにして、ユーザーは両方の方向にスワイプして、無限スクロールの錯覚を作り出すことができます。

E,A,[B],C,D,E,A


アップデート

このアルゴリズムの完全な実装をアップロードしました。これは非常に複雑なクラスです。クリックによる選択、無限の循環スクロール、セルの再利用もあるからです。コードをそのまま使用することも、変更することも、必要なコードを抽出することもできます。最も興味深いコードは class にありTCHorizontalSelectorViewます。

ファイルへのリンク

楽しめ!


更新 2

UICollectionViewは、これを実現するための推奨される方法であり、まったく同じ動作を得るために使用できます。このチュートリアルでは、それを実現する方法について詳しく説明します。

于 2012-05-04T11:45:27.807 に答える
4

Apple には、Street Scrollerのデモがあり、まさにあなたが望むものを持っているようです。

また、WWDC 2011 のデモをデモするビデオもあります。;) ビデオの最初に無限スクロールについて説明します。

于 2012-05-04T11:57:04.437 に答える
0

次のコードを使用してみてください..

サンプルコード..

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender 
    {

        if (scrollView.contentOffset.x == 0) {
            // user is scrolling to the left from image 1 to image n(last image).
            // reposition offset to show image 10 that is on the right in the scroll view
            [scrollView scrollRectToVisible:CGRectMake(4000,0,320,480) animated:NO];// you can define your `contensize` for scrollview
        }
        else if (scrollView.contentOffset.x == 4320) {
            // user is scrolling to the right from image n(last image) to image 1.
            // reposition offset to show image 1 that is on the left in the scroll view
            [scrollView scrollRectToVisible:CGRectMake(320,0,320,480) animated:NO];
        }
    }

うまくいけば、これはあなたを助けるでしょう...

于 2012-05-04T11:39:56.080 に答える
0

@ redent84 からの参照で、コード ロジックを見つけます。

オーバーライド func viewWillAppear(_ animation: Bool)

{
    super.viewWillAppear(animated)

    scrollView.contentSize = CGSize(width: scrollView.frame.width * CGFloat(imagesArray.count), height: scrollView.frame.height)

    scrollView.isPagingEnabled = true

    //        imagesArray.insert(imagesArray.last as? UIImage, at: 0)
    //        imagesArray.insert(imagesArray.first as? UIImage, at: imagesArray.count - 1)


    var testArr = ["A", "B", "C", "D"]

    let firstItem = testArr.first
    let lastItem = testArr.last

    testArr.insert(lastItem as! String, at: 0)
    testArr.append(firstItem as! String)
    print(testArr)


    for i in 0..<imagesArray.count{
        let imageview = UIImageView()
        imageview.image = imagesArray[i]
        imageview.contentMode = .scaleAspectFit
        imageview.clipsToBounds = true
        let xPosition = self.scrollView.frame.width * CGFloat(i)
        imageview.frame = CGRect(x: xPosition, y: 0, width: self.scrollView.frame.width, height: self.scrollView.frame.height)
        print(imageview)
        scrollView.addSubview(imageview)

        print("Imageview frames of i \(i) is \(imageview.frame)")
    }

    newStartScrolling()
}

func newStartScrolling()
{
    ViewController.i += 1

    let x = CGFloat(ViewController.i) * scrollView.frame.size.width
    scrollView.setContentOffset(CGPoint(x: x, y: 0), animated: true)

    print("X is \(x) and i is \(ViewController.i)")

    if ViewController.i == imagesArray.count - 1 {
        ViewController.i = 0
        let x = CGFloat(ViewController.i) * scrollView.frame.size.width
        //scrollView.setContentOffset(CGPoint(x: x, y: 0), animated: false)
        print("X (rotate) is \(x) and i is \(ViewController.i)")
        scrollView.contentOffset.x = x
        self.newStartScrolling()

    }

}

func backScrolling()  {
    ViewController.i -= 1

    let x = CGFloat(ViewController.i) * scrollView.frame.size.width
    scrollView.setContentOffset(CGPoint(x: x, y: 0), animated: true)
    print("X is \(x) and i is \(ViewController.i)")
    if ViewController.i <= 0 {
        ViewController.i = imagesArray.count - 1
        let x = CGFloat(ViewController.i) * scrollView.frame.size.width
         scrollView.setContentOffset(CGPoint(x: x, y: 0), animated: false)
        print("X (rotate) is \(x) and i is \(ViewController.i)")

        self.backScrolling()
        //scrollView.contentOffset.x = x
        return
    }

}
于 2019-03-29T09:47:25.667 に答える