UIScrollView - 如何区分setContentOffset和手动滚动的区别

7
我有一个滚动视图,每隔3秒自动滚动到下一个“页面”(也使用了页面控件)。但是,一旦用户触摸滚动视图,我希望停止自动滚动。
我已经对滚动视图进行了子类化。我可以在子类中检测到touchesBegan,但是touchesMoved没有被调用,因此我无法判断用户是否手动滑动了滚动视图。我不能使用scrollviewDidScroll,因为当自动滚动计时器触发时,会调用该方法来设置contentOffset。
那么,我如何检测触摸事件?为什么滚动视图子类上不调用touchesMoved?
3个回答

7
谢谢您的建议。它们让我偶然发现了这个简单的解决方案:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.scrollTimer invalidate];
}

2

您可能需要查看以下委托方法:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

根据Apple官方文档:

当UIScrollView实现UIScrollView和setContentOffset:animated:和scrollRectToVisible:animated:方法时,仅在请求动画时才调用滚动视图此方法。

因此,当程序化滚动发生时,才会调用该委托方法。您可以在该方法中设置自动滚动调用,仅在某个BOOL值为false时才调用它,在您的触摸事件中将该BOOL值设置为true。

或者选择完全不同的方法 =]

无论如何,这是一个有用的委托方法。

~祝好运


1

ScrollView可能会指定一个子视图来接收触摸输入 - UIKit对象对这种事情非常挑剔,通常甚至无法处理转发的事件。

您可能想要做的是键值观察trackingdragging(听起来您想要后者)。如果相关属性更改为true,则知道用户已启动滚动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接