UITableView scrollViewDidScroll在动画上触发

Lev*_*rts 5 objective-c uitableview uiscrollview ios ios7

因此,人们对这一特定事件的大多数问题都是在scrollViewDidScroll发生动画时发生火灾.我的情况正好相反.我觉得scrollViewDidScroll不应该在我的情况下解雇.

让我进一步解释一下.

我正在使用scrollViewDidScroll中的动画,这一直很有效,直到我将UITableView移动到UIView类中.

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
   // Animation code here.
   NSLog(@"scrollViewDidScroll");
}

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
   NSLog(@"scrollViewDidEndDecelerating");
   NSArray *indexPaths = [_myTableView indexPathsForVisibleRows];
   [_myTableView scrollToRowAtIndexPath:[indexPaths objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
Run Code Online (Sandbox Code Playgroud)


这提供了一个平滑的滚动体验,可以快速回到上一个表格行.控制台可以验证scrollViewDidScroll事件是否因为触发而触发scrollToRowAtIndexPath.

安慰:

2014-03-31 22:21:43.346 Project[45843:a0b] scrollViewDidScroll
2014-03-31 22:21:43.379 Project[45843:a0b] scrollViewDidScroll
2014-03-31 22:21:43.429 Project[45843:a0b] scrollViewDidScroll
2014-03-31 22:21:43.462 Project[45843:a0b] scrollViewDidScroll
2014-03-31 22:21:43.479 Project[45843:a0b] scrollViewDidEndDecelerating
2014-03-31 22:21:43.496 Project[45843:a0b] scrollViewDidScroll
2014-03-31 22:21:43.513 Project[45843:a0b] scrollViewDidScroll
2014-03-31 22:21:43.529 Project[45843:a0b] scrollViewDidScroll
Run Code Online (Sandbox Code Playgroud)

在问题上:

1.如何确保事件scrollViewDidScroll仅在用户交互时触发而不是代码自动化?

2.是否有另一种方法提供与scrollToRowAtIndexPath不触发相同的功能scrollViewDidScroll

Ism*_*ail 15

我知道这是一个非常古老的问题.我只是处于类似的情况,我只需要在用户滚动时运行一些代码而不是在我打电话时运行scrollToRowAtIndexPath.我发现这个使用了滚动变量的简单的解决方案draggingdecelerating.

我们这里有3个滚动案例.

  1. 用户正在拖动
  2. 用户刚刚结束拖动而tableview正在减速
  3. 以编程方式调用 scrollForRowAtIndexPath:

所有的上述情况将触发scrollViewDidScroll: ,但

  1. 用户拖动draggingTrue并且deceleratingFalse
  2. 用户刚刚结束拖动,并且tableview是decelrating draggingFalse并且deceleratingTrue
  3. 以编程方式调用的scrollForRowAtIndexPath: draggingFalse并且deceleratingFalse

所以你的代码将是这样的:

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.dragging)
     {
       // Do what you want when user is dragging
     } else if (scrollView.decelerating) 
     {
       // Do what you want when table is decelerating after finished dragging
     } else 
     {
       // Do what you want when table is scrolling programmatically.
     }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想区分滚动编程

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.dragging || scrollView.decelerating)
     {
       // Scrolling by the user
     } else 
     {
       // Scrolling by the code
     }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比滚动我自己更优雅的解决方案!将此更改为已接受的答案. (2认同)