uiscrollview抓住滚动尝试

时间:2011-10-13 12:26:55

标签: iphone objective-c ios ios4

我正在使用UIScrollView子类,我只是想捕捉一个特殊的事件,但我不知道如何处理它。 基本上我有一个水平的uiscrollview,它已经关闭弹跳。当我滚动到滚动视图的任一端时,它应该停止它所做的。但是现在我想要抓住一个事件,如果用户尝试向当前占用的内容结束方向滑动。即如果用户一直向右滚动并尝试再次向右滑动,我该如何捕捉到这种姿势。

我尝试将手势识别器添加到uiscrollview子类中,当它到达结尾时,它会关闭启用滚动功能,从而可以捕获这些手势。但是,如果用户尝试在可用的方向上滑动,则滚动效果不会发生,因为滚动关闭。即,当用户向右滚动时,然后尝试向左滚动,当滚动关闭以捕捉到可能的右手势时,不会发生任何事情。

关于如何尝试在特定方向上滚动的任何想法? 感谢

4 个答案:

答案 0 :(得分:1)

捕获该事件的一种方法是将跳转设置为属性YES,并在scrollview子类中自己实现停止跳转。通过重写setContentOffset方法,您可以替换它滚动到的坐标。当发生这种情况时,你也可以让其他事情发生。

-(void)setContentOffset:(CGPoint)contentOffset
{
    CGPoint validOffset = [self validVersionOfOffset:contentOffset];

    if(contentOffset.x == validOffset.x)
    {
        [super setContentOffset:validOffset];
    }
    else
    {
        [super setContentOffset:validOffset animated:NO];
        [bounceCatchDelegate scrollViewTriedBouncing:self];
    }
}

-(void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated
{
    CGPoint validOffset = [self validVersionOfOffset:contentOffset];
    [super setContentOffset:validOffset animated:animated];
    if(contentOffset.x == validOffset.x)
    {
        [super setContentOffset:validOffset animated:animated];
    }
    else
    {
        [super setContentOffset:validOffset animated:NO];
        [bounceCatchDelegate scrollViewTriedBouncing:self];
    }
}

-(CGPoint)validVersionOfOffset:(CGPoint)offset
{
    //Prevents bouncing at the left and right:
    offset.x = fminf(offset.x, self.contentSize.width-CGRectGetWidth(self.frame));
    offset.x = fmaxf(offset.x, 0.0f);
    return offset;
}

委托的使用只是一个建议,任何方法调用都可以。

答案 1 :(得分:0)

这是一种解决方法,但您可以将contentSize设置为更大的实际值。然后在scrollViewDidScroll委托方法中,您可以检查scrollview的contentOffset。如果它高于期望值,则将其设置回您的上限并按照您的要求进行操作。也许它在视觉上看起来不那么好,但它可以起作用。很难说出你的目标是什么。

答案 2 :(得分:0)

有点黑客攻击它不漂亮但工作

开始关闭弹跳

使用 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {}

我检查内容偏移,如果在滚动视图的任一端,我将其标记为,并将弹跳设置为开启。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {}

我还检查了这里的contentoffset,它超出了滚动内容的任何一个,然后关闭滚动并将内容视图设置为结束位置。下面是代码。非常混乱,完全感到羞耻,但处理不好。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{

    int t = self.contentOffset.x;
    if (t==0) {
        leftSet = YES;
        rightSet = NO;
        self.bounces = YES;
    } else if (t>=imagePosX-480) {//if scrollview reaches the end 
        rightSet = YES;
        leftSet = NO;
        self.bounces = YES;
    }

}


-(void)scrollViewDidScroll:(UIScrollView *)scrollView{

    int t = self.contentOffset.x; 

    if (t<=0) {
        if (leftSet) {
            self.bounces = NO;
            self.scrollEnabled = NO;

            //perform code i wanted here


        }


    } else if (t>=imagePosX-480) {//if scrollview reaches the end then snap back to start

        if (rightSet) {
            self.bounces = NO;
            self.scrollEnabled = NO;
            //perform code i wanted here

        }

    }
    else{
        rightSet = NO;
        leftSet = NO;
        self.bounces = NO;
    }



}

我绝不推荐上面的内容,但是该死的,它真的有用,不幸的是有更大的鱼可以炒。我接近于为我工作的异常方式,当然看起来更清洁,所以如果有人说他的作品不合格,则将其作为答案投票。

答案 3 :(得分:0)

在我的情况下,我使用以下内容设置了scrollView设置的contentSize:

    self.scrollView.minimumZoomScale = (self.scrollView.frame.size.width/self.scrollView.contentSize.width);

这意味着只要用户开始放大滚动视图,就会触发nan并触发异常。