how to implement cyclic scrolling on tableview

前端 未结 4 742
走了就别回头了
走了就别回头了 2021-01-04 21:26

Could you please help me with circular scrolling in tableview please.

I want that if I scroll down tableview, the rows should go in the reverse way -- it should app

4条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-01-04 21:39

    This question has already been asked: implementing a cyclic UITableView I'm copying that answer here to make it easier because the asker hasn't ticked my answer.

    UITableView is same as UIScrollView in scrollViewDidScroll method.

    So, its easy to emulate infinite scrolling.

    1. double the array so that head and tail are joined together to emulate circular table

    2. use my following code to make user switch between 1st part of doubled table and 2nd part of doubled table when they tend to reach the start or the end of the table.

    :

    /* To emulate infinite scrolling...
    
    The table data was doubled to join the head and tail: (suppose table had 1,2,3,4)
    1 2 3 4|1 2 3 4 (actual data doubled)
    ---------------
    1 2 3 4 5 6 7 8 (visualising joined table in eight parts)
    
    When the user scrolls backwards to 1/8th of the joined table, user is actually at the 1/4th of actual data, so we scroll instantly (we take user) to the 5/8th of the joined table where the cells are exactly the same.
    
    Similarly, when user scrolls to 6/8th of the table, we will scroll back to 2/8th where the cells are same. (I'm using 6/8th when 7/8th sound more logical because 6/8th is good for small tables.)
    
    In simple words, when user reaches 1/4th of the first half of table, we scroll to 1/4th of the second half, when he reaches 2/4th of the second half of table, we scroll to the 2/4 of first half. This is done simply by subtracting OR adding half the length of the new/joined table.
    
     Written and posted by Anup Kattel. Feel free to use this code. Please keep these comments if you don't mind.
    */
    
    
    -(void)scrollViewDidScroll:(UIScrollView *)scrollView_ 
    {  
    
        CGFloat currentOffsetX = scrollView_.contentOffset.x;
        CGFloat currentOffSetY = scrollView_.contentOffset.y;
        CGFloat contentHeight = scrollView_.contentSize.height;
    
        if (currentOffSetY < (contentHeight / 8.0)) {
        scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY + (contentHeight/2)));
        }
       if (currentOffSetY > ((contentHeight * 6)/ 8.0)) {
           scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY - (contentHeight/2)));
        }
    
    }
    

    P.S. - I've used this code on one of my apps called NT Time Table (Lite). If you want the preview, you can check out the app: https://itunes.apple.com/au/app/nt-time-table-lite/id528213278?mt=8

    If your table can sometimes be too short, at the beginning of the above method you can add a if logic to exit when data count is say for example less than 9.

提交回复
热议问题