scrollViewDidScroll:以编程方式滚动时?
Posted
技术标签:
【中文标题】scrollViewDidScroll:以编程方式滚动时?【英文标题】:scrollViewDidScroll: when scroll programmatically? 【发布时间】:2014-05-23 13:01:31 【问题描述】:我有这个委托,它打算在用户用手指滚动时执行:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
我有这行代码滚动到开头:
[scroller scrollRectToVisible:CGRectMake(0, 0,scroller.frame.size.width,scroller.frame.size.height) animated:YES];
当我执行这行代码以编程方式滚动时,第一个委托也被调用。 我想避免这种情况发生。
我试图将委托设置为 nil,但它仍然执行委托:
scroller.delegate=nil;//to not excute scrolldidscroll
[scroller scrollRectToVisible:CGRectMake(0, 0,scroller.frame.size.width,scroller.frame.size.height) animated:YES];
scroller.delegate=self;
编辑:
我已经阅读了这个很好的答案:Setting contentOffset programmatically triggers scrollViewDidScroll 但似乎他的解决方案(第一个)没有动画,而我需要那个动画。
【问题讨论】:
【参考方案1】:可能有更好的解决方案,但这应该可行:
在你的 .h 中声明一个布尔值
@property(nonatomic,assign) BOOL scrollingProgrammatically;
在你的 .m 中:
self.scrollingProgrammatically = YES;
[scroller scrollRectToVisible:CGRectMake(0, 0,scroller.frame.size.width,scroller.frame.size.height) animated:YES];
...
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
if(!self.scrollingProgrammatically)
...
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
self.scrollingProgrammatically = NO;
【讨论】:
好的,我会去的.. :) 嗯,是的,可能没有更轻松的方法可以做到这一点。我也编辑了我的答案,因为如果以编程方式调用滚动,则不会调用 didEndDragging。 它确实做到了!拖动方法(您的第一个答案)也对我有用。奇怪。以上是关于scrollViewDidScroll:以编程方式滚动时?的主要内容,如果未能解决你的问题,请参考以下文章
我能以某种方式从 UIPageViewController 获取 scrollViewDidScroll: UIScrollView Delegate 方法吗?
scrollViewDidScroll scrollViewWillEndDragging 在主线程上同时运行?
我的应用调用 scrollViewDidScroll 19 次
用奇怪的 contentOffsetY 调用 scrollViewDidScroll
视差 UIScrollView – 在一个 scrollViewDidScroll 方法中处理两个视图?
使用 swift 将 y contentOffset 从 scrollViewDidScroll(scrollView 传递到另一个视图控制器