在scrollViewWillBeginDragging中检测UIScrollView的滚动方向
我没有足够的谷歌,我没有检查这些post( 在UIScrollView中查找滚动的方向? )在发布之前在计算器中。 我有一个iPhone应用程序中的dynamic数量的照片,通过UIScrollView
显示。 在任何时候,我只有3张照片显示在滚动视图中。 当我有,总共说4张照片:第一张照片:显示在偏移0.0第二张照片:显示在偏移320.0第三张照片:显示在偏移640.0
现在,当用户滚动到第4张照片时,滚动视图重置为0.0偏移量。 如果用户试图滚动“超出”第四张照片,滚动只应停止在正确的方向(以便用户不滚动“超出”)。 但是目前,用户能够滚动到最后一张照片之外; 但是,我检测到这个编程方式&重置偏移量。 但它看起来不整齐,因为用户瞬间看到黑色背景。 我想检测到用户已经开始滚动“右”(记住,滚动“左”,即“先前”的照片是好的)在scrollViewWillBeginDragging
,以便我可以停止进一步滚动向右。
我试过的:
- 尝试使用
self.scrollView.panGestureRecognizer
的translationInView
不起作用,因为没有panGestureRecognizer
实例在第一个地方(!)返回,尽pipeUIScrollView API声称如此。 - 在
scrollViewDidEndDecelerating
检测到这scrollViewDidEndDecelerating
是可能的,尽pipe它不会达到我的目的。
在检查滚动视图的panGestureRecognizer
时,我没有在scrollViewWillBeginDragging
确定方向的panGestureRecognizer
:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview]; if(translation.y > 0) { // react to dragging down } else { // react to dragging up } }
我发现当用户在禁止方向拖动时,在第一次拖动时取消滚动非常有用。
适用于swift 2.0+和ios 8.0+
func scrollViewWillBeginDecelerating(scrollView: UIScrollView) { let actualPosition = scrollView.panGestureRecognizer.translationInView(scrollView.superview) if (actualPosition.y > 0){ // Dragging down }else{ // Dragging up } }
这是我使用的,它至less在iOS 6.0上很好地工作:
- (void)scrollViewDidScroll:(UIScrollView*)scrollView { CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView]; // Detect direction by accessing x or y of translation }
为lastContentOffset
保存实例variables…
谢谢你,克里斯。 这对我来说很有效,最后:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { // Detect the scroll direction if (lastContentOffset < (int)scrollView.contentOffset.x) { ... } }
Swift 3解决scheme
1-添加UIScrollViewDelegate
2-添加此代码
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) { let actualPosition = scrollView.panGestureRecognizer.translation(in: scrollView.superview) if (actualPosition.y > 0){ // Dragging down }else{ // Dragging up } }
在iOS 7+中,基于scrollView的泛识别器的翻译来检测滚动方向似乎存在问题。 这似乎是为我的目的无缝工作
func scrollViewDidScroll(scrollView: UIScrollView) { if !scrollDirectionDetermined { let translation = scrollView.panGestureRecognizer.translationInView(self.view) if translation.y > 0 { println("UP") scrollDirectionDetermined = true } else if translation.y < 0 { println("DOWN") scrollDirectionDetermined = true } } } func scrollViewWillBeginDragging(scrollView: UIScrollView) { scrollDirectionDetermined = false } func scrollViewDidEndDecelerating(scrollView: UIScrollView) { scrollDirectionDetermined = false }
看看scrollViewWillEndDragging:withVelocity:targetContentOffset:
你可以使用该方法做任何检查,看看它是否应该在哪里,然后在方法中,你可以设置一个新的targetContentOffset
。
根据文档 :
当滚动视图的pagingEnabled属性的值为YES时,不调用此方法。 您的应用程序可以更改targetContentOffset参数的值,以调整滚动视图完成其滚动animation的位置。
scrollView.panGestureRecognizer translationInView:scrollView
不会在iOS 7的scrollViewWillBeginDragging
中报告任何有用的scrollViewWillBeginDragging
。
这样做:
在@interface
BOOL scrollDirectionDetermined;
和:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (!scrollDirectionDetermined) { if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x > 0) { //scrolling rightwards } else { //scrolling leftwards } scrollDirectionDetermined = YES; } }
和:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { scrollDirectionDetermined = NO; }
build立@奥斯卡的答案,你可以做的事情
scrollView.bounces = actualPosition.y < 0
如果您希望scrollView在您滚动到底部时反弹但不滚动到顶部