我足够google了,&在发布之前,我确实在stackoverflow中检查了这些帖子(Finding the direction of scrolling in a UIScrollView?)。我在iPhone应用程序中有动态数量的照片,通过UIScrollView
显示。在任何时候,我只在滚动视图中显示3张照片。当我有,总共说4张照片:
第一张照片:显示偏移0.0
第二张照片:偏移320.0显示
第3张照片:显示在偏移640.0
现在,当用户滚动到第4张照片时,滚动视图将重置为0.0偏移。如果用户试图滚动“超出”第4张照片,则滚动应仅在右向停止(因此用户不会滚动“超出”)。但是目前,用户'能够'滚动到最后一张照片之外;但是,我以编程方式检测到了这一点。重置偏移量。但它看起来并不整洁,因为用户会瞬间看到黑色背景。我想检测用户是否已经开始向右滚动(请记住,在'{1}}中滚动'左'即'上一张'照片是可以的',这样我就可以停止向右滚动。< / p>
我尝试了什么:
scrollViewWillBeginDragging
self.scrollView.panGestureRecognizer
无效,因为没有
translationInView
实例首先返回(!),
虽然UIScrollView API声称如此。panGestureRecognizer
中检测到这一点
它不会达到我的目的。答案 0 :(得分:27)
在检查滚动视图的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
}
}
我发现当用户在禁止的方向拖动时,在第一次拖动移动时取消滚动非常有用。
答案 1 :(得分:12)
对于swift 2.0+&amp; ios 8.0 +
func scrollViewWillBeginDecelerating(scrollView: UIScrollView) {
let actualPosition = scrollView.panGestureRecognizer.translationInView(scrollView.superview)
if (actualPosition.y > 0){
// Dragging down
}else{
// Dragging up
}
}
答案 2 :(得分:9)
Swift 3解决方案
1-添加UIScrollViewDelegate
2-添加此代码
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
let actualPosition = scrollView.panGestureRecognizer.translation(in: scrollView.superview)
if (actualPosition.y > 0){
// Dragging down
}else{
// Dragging up
}
}
答案 3 :(得分:6)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// Detect the scroll direction
if (lastContentOffset < (int)scrollView.contentOffset.x) {
...
}
}
答案 4 :(得分:5)
这是我使用的,至少在iOS 6.0上它很好用:
- (void)scrollViewDidScroll:(UIScrollView*)scrollView
{
CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView];
// Detect direction by accessing x or y of translation
}
为lastContentOffset
...
答案 5 :(得分:1)
基于iOS 7+中scrollView的pan识别器的转换,似乎存在检测滚动方向的问题。这似乎是为了我的目的而无缝地工作
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
}
答案 6 :(得分:0)
看看scrollViewWillEndDragging:withVelocity:targetContentOffset:
。
您可以使用该方法执行任何检查并查看它是否应该在不应该的位置,然后在方法中您可以设置新的targetContentOffset
。
当滚动视图的pagingEnabled属性的值为YES时,不会调用此方法。您的应用程序可以更改targetContentOffset参数的值,以调整scrollview完成滚动动画的位置。
答案 7 :(得分:0)
scrollView.panGestureRecognizer translationInView:scrollView
不会在iOS 7中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;
}
答案 8 :(得分:0)
建立@ Oscar的答案,你可以做一些事情,比如
scrollView.bounces = actualPosition.y < 0
如果您希望滚动到底部时滚动视图反弹,但滚动到顶部时不滚动