首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >uiscrollview捕获滚动尝试

uiscrollview捕获滚动尝试
EN

Stack Overflow用户
提问于 2011-10-13 20:26:55
回答 4查看 1.5K关注 0票数 0

我正在使用一个UIScrollView子类,我只是试图捕捉一个特定的事件,但我不知道如何处理它。基本上我有一个水平的uiscrollview,它已经关闭了弹跳。当我滚动到滚动视图的两端时,它应该会停止,它确实会停止。但是现在,如果用户尝试向当前占用的内容末尾的方向滑动,我想捕捉一个事件。例如,如果用户一直向右滚动,并尝试再次向右滑动,我如何捕捉此手势。

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

关于如何捕捉在特定方向上滚动的尝试,有什么想法吗?谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-13 20:45:31

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

代码语言:javascript
运行
复制
-(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
EN

Stack Overflow用户

发布于 2011-10-13 20:34:19

这是一种变通方法,但您可以将contentSize设置得更大。然后在scrollViewDidScroll委托方法中,您可以检查滚动视图的contentOffset。如果它高于所需的值,您可以将其设置回您的上限,然后根据需要进行调整。也许它在视觉上看起来不是很好,但它可以工作。很难说你的目标是什么。

票数 0
EN

Stack Overflow用户

发布于 2011-10-13 22:19:35

有点像是把一些东西拼凑在一起,虽然不是很好,但很管用

从关闭反弹开始

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

我检查contentoffset,如果在滚动视图的两端,我就将其标记为是,并将bouncing设置为on。然后在

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

我还检查了这里的contentoffset,以及它是否超出了滚动内容的两端,然后关闭滚动并将内容视图设置到结束位置。下面是代码。非常混乱,对此感到非常羞愧,但我会处理它的。

代码语言:javascript
运行
复制
- (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;
    }



}

我决不推荐上面的方法,但它真的有效,不幸的是,还有更重要的事情要做。我的工作方式差一点就变了,而且看起来很干净,所以如果有人说他的作品会默认,请投票给我作为答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7754098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档