How can I make uiscrollview infinite in iOS?

2019-01-16 21:39发布

问题:

I want to scroll like that 1 2 3 1 2 3

I have some buttons suppose 10 which i want to show on endless scroll.

 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)];

This is my code for make butttons on scrollview.

How can I set in - (void)scrollViewDidEndDecelerating:(UIScrollView *)sender this method for infinite scroll.

回答1:

Just need to do set setContentOffset count

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


回答2:

Main idea is to reposition your scrollview back to some constant value, when it has been scrolled to some value and then auto-reposition your "1" , "2", "3" items correctly.

For example - You would have scrollview with contentwidth 5000. By default You set it to position 2500.

then You simply check in - (void)scrollViewDidCScroll:(UIScrollView *)scrollview - if scrollview.contentoffset.x > 3500 - then decrease it's position to scrollview.contentoffset.x -=1000;

and the same about other side. This will result in infinite scrolling.

But content will not follow. So - You would need to implement extra content offset value checking to reorder and reposition correctly "1", "2", "3", items.

I usually use 3 elements and then dynamically preload necessary gallery image for them.

If You don't want to re-invent the "wheel" , check out these solutions:

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

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

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



回答3:

You can check out this solution based on Apple StreetScroller iOS sample code:

https://github.com/gblancogarcia/GBInfiniteScrollView

I hope it helps!



回答4:

I have written an infinite rolling UIscrollView subclass which accomplishes this task. It is based on the Apple StreetScroller sample. You simply provide it with your button titles and whether you want a horizontal or vertical scroll. You can also set many other options. It is posted with documentation and a sample project on my github. Here is the link...

http://github.com/ninefifteen/SSRollingButtonScrollView



回答5:

This is an old question, but I'm writing this to help whom searching for same solution. Suppose that we wish to infinitely loop through 3 items(cells) - C0, C1, C2, we can generate dummy cells at the left and right side of center cells, the result as follows,

C0 C1 C2 [C0 C1 C2] C0 C1 C2

Cells in bracket are cells we see through device screen, and if we scroll to left,

C0 [C1 C2 C0] C1 C2 C0 C1 C2

at this moment, force contentOffset to point right side of given dummy cells,

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

Since it's time consuming job to implement this seamlessly, I recommend my solution below.

https://github.com/DragonCherry/HFSwipeView

If you just wanna check how it works, click link below and "tap to play".

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



回答6:

I've implemented an infinite scroller in swift.
It's inspired by apple StreetScroller example

I know is not perfect yet, but I think is a god start point.

InfiniteVerticalScroller



回答7:

For right infinite scroll you can use -

        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)
    })