如何在tableview上实现循环滚动

时间:2011-04-15 10:43:11

标签: iphone objective-c cocoa-touch uitableview scroll

请你在桌面视图中帮助我循环滚动。

我希望如果我向下滚动tableview,行应该以相反的方式进行 - 看起来应该向后移动(底行四处走动,现在从顶部回落),即基本上循环滚动。

我该怎么办?请提出任何建议。

提前完成。

4 个答案:

答案 0 :(得分:3)

您可以“伪造”循环滚动,重复重复相同的单元格。在numberOfRowsInSection方法中,返回实际行数的n倍。确保n足够大。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return numberOfActualRows*100;
}

然后在cellForRowAtIndexPath方法(以及其他地方)中使用mod运算符(%)返回正确的单元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger actualRow = indexPath.row % numberOfActualRows;
    ...
}

您可能想隐藏滚动指示器。

self.tableView.showsVerticalScrollIndicator = NO;

您可能还希望在显示表格之前将表格视图显示在中间,以便向后滚动可以正常工作。

[self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]/2 inSection:0]  atScrollPosition:UITableViewScrollPositionTop animated:NO];

当然,如果用户一遍又一遍地滚动,用户最终会击中底部或顶部。

答案 1 :(得分:2)

此问题已被提出:implementing a cyclic UITableView 我正在复制这个答案,以便更容易,因为提问者没有勾选我的答案。

UITableView与scrollViewDidScroll方法中的UIScrollView相同。

因此,它很容易模仿无限滚动。

  1. 将数组加倍,使头部和尾部连接在一起,以模拟圆形表格

  2. 使用我的以下代码,当用户往往到达表的开头或结尾时,用户可以在doubled表的1st部分和doubled表的2nd部分之间切换。

  3. /* 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。 - 我在我的一个名为NT Time Table(Lite)的应用程序中使用了这段代码。如果您想要预览,可以查看应用:https://itunes.apple.com/au/app/nt-time-table-lite/id528213278?mt=8

    如果您的表有时太短,在上述方法的开头,您可以添加一个if逻辑,以便在数据计数例如小于9时退出。

答案 2 :(得分:1)

我自己没有这样做,但是您可以尝试使用UIScrollView实现的方法来实现视图的循环滚动(在所有UITableView都是UIScrollView的子类之后)。

我会这样做:

  1. 使用任意数量的单元格创建一个UITableView(至少7个,但需要更多以防止最后快速滚动碰撞)
  2. 定位您的UITableView以便中心单元格可见
  3. 维护指向要显示的单元格索引的指针
  4. 在你的cellForRowAtIndexPath中:使用你的指针作为偏移量并将行添加到它以获得你想要的单元格
  5. 当UITableView停止移动时(您的UITableViewDelegate可以作为UIScrollViewDelegate使用,因此您可以使用scrollViewDidEndDecelerating)。将偏移索引设置为当前单元格,将表格视图移回中心单元格而不动画,然后重新加载数据。
  6. 您将遇到的问题是,如果用户不停地滚动,他们最终会在达到表格中的单元格数时碰到保险杠。

    希望这会有所帮助,如果你开始工作并且看起来合情合理,请回复。

    此致

    戴夫

答案 3 :(得分:-1)

这非常难以实施。但是,请查看ScorllingMadness,它在滚动视图中显示嵌套(循环)页面的演示。

你需要使用类似的技巧,因为UITableView是UIScrollView的子类。