UIScrollView的与“通知”滚动(UIScrollView with “Circular”

2019-06-24 04:08发布

我试图让“通知”在我的UIScrollView滚动,但不成功。

我想要做的:如果UIScrollView的达到目的,就应该移动到开始,如果UIScrollView的开始和向后移动,就应该移动到终点

追加滚动型是不是好办法在我的情况(其他方法应该得到“页面ID”)

你有什么想法?

Answer 1:

我实现了这个方法,但它需要分页功能 。 让我们假设你有五个要素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]

然后,自动设定内容偏移至第二元件

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

通过这种方式,用户可以刷卡两种方式创建无限滚动的错觉。

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


更新

我已经上传了该算法的完整实现 。 这是一个非常复杂的类,因为它也有上点击选择,无限循环滚动和小区重用。 您可以直接使用的代码,修改或提取您需要的代码。 最有趣的代码是在类TCHorizontalSelectorView

链接到文件

好好享受!


更新2

UICollectionView现在推荐的方式来实现这一点,它可以用来获得同样的行为。 本教程详细描述了如何实现它。



Answer 2:

苹果有街滚轮 ,似乎有正是你想要的演示。

还有一个视频从2011年WWDC该演示他们的演示。 ;)他们首先在视频覆盖无限滚动。



Answer 3:

尝试使用下面的代码..

示例代码..

- (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];
        }
    }

希望对你有帮助...



Answer 4:

从@ redent84参考,发现代码逻辑。

覆盖FUNC viewWillAppear中(_动画: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
    }

}


文章来源: UIScrollView with “Circular” scrolling