2011-10-13 56 views
0

我正在使用UIScrollView的子类,我只是试图捕捉一个特殊的事件,但我不知道如何接近它。 基本上我有一个水平的uiscrollview,它有弹跳关闭。当我滚动到滚动视图的任何一端时,它应该停止死亡。但是现在如果用户尝试在当前占用的内容结尾的方向上滑动,我想捕获一个事件。即,如果用户一直向右滚动并且试图再次向右滑动,我如何捕捉该姿势。uiscrollview catch滚动尝试

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

关于如何捕捉试图在特定方向上滚动的任何想法? 谢谢

回答

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; 
} 

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

+0

couldnt相当适合我的工作,但它肯定给我一个好主意,以便今后的工作+1 – glogic

+0

什么没有工作?我可以帮忙吗? – Aberrant

+0

我的uiscrollview子类是用 @interface WallScrollView:UIScrollView {}创建的,我把上面的setcontentoffset代码放在里面。这确实可以捕获所有的setcontent调用。但是[super setcontentoffset:validoffset]这行对我来说崩溃了 – glogic

0

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

+0

以及滚动视图占用全屏,然后当用户试图滑过内容时,我想将整个滚动视图移出屏幕并用其他视图替换它。我给你什么建议一个镜头,并回复给你 – glogic

0

有点黑客攻击的东西在一起的不漂亮,但工作

开始使用弹跳关闭

- (空)scrollViewWillBeginDragging:(UIScrollView的*)滚动视图{}

我检查contentoffset如果在滚动视图的任一端,我然后标记它并设置反弹。然后在

- (空)scrollViewDidScroll:(UIScrollView的*)滚动视图{}

我还检查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; 
    } 



} 

我绝不推荐上面这个,但是上帝该死的工作,不幸的是有更大的鱼来炒。我正在接近为我工作的异常方式,而且看起来更清洁,所以如果有人说他的作品没有得到任何答案的话。

0

在我来说,我有contentSize的滚动视图设置使用AFTER:

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

其中,一旦意味着作为用户开始放大的滚动视图楠被击中并引发异常。