2010-10-19 71 views
7

我有一个滚动相当大的UIView的UIScrollView。限制UIScrollView中的滚动区域

在某些时候,我想限制用户可以滚动的区域。例如,我可能只想让他们查看视图的底部四分之一。

我能够通过重写scrollViewDidScroll来限制区域,然后在视图滚动得太远的情况下调用setContentOffset。但是这样我就无法像UIScrollView在UIView界限以上滚动时那样顺畅地反弹。

是否有更好的方法来限制UIScrollView中的可滚动区域?

回答

17

我会将滚动视图的contentSize属性更改为您希望用户能够滚动的区域的大小,并调整子视图的frame.origin,例如您想要的左上边界出现在( 0,0)相对于滚动视图。例如,如果您的视图高800点,并且想要显示底部四分之一,请将contentSize的高度设置为200,并将view.frame.origin的y分量设置为-600。

+3

你的回答是恰到好处的提示,我需要解决类似的问题,我有。基本上,uiscrollview.frame.size和uiscrollview.contentsize之间的差异就成为您允许的可滚动部分。您可以使用uiscrollview中的uiview进行游戏,只需使用uiview.frame和uiview.size即可获得所需的效果。一旦你明白了这一点,生活就是美好的。快乐滚动! :) – HM1 2012-03-24 01:23:38

+0

这里是封装类似逻辑的解决方案的示例: https://github.com/ealeksandrov/EARestrictedScrollView – 2016-04-25 18:29:28

2

我发现了一些适合我的东西。它让你滚动到0,0点,但没有进一步的:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView.contentOffset.x <= -1) { 
     [scrollView setScrollEnabled:NO]; 
     [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; 
     [scrollView setScrollEnabled:YES]; 
    } 
} 

你可以为顶部,底部或右(x或y)做同样的

+2

该方法的问题在于,您失去了“反弹” - 您在该区域之外滚动并轻轻滚动当你放开时,它会回复。 – 2014-07-31 14:36:59

+0

垃圾你是对的,没有正确阅读。不过,也许这可以帮助别人。 – Yoko 2014-07-31 15:07:38

0

另一种方法是重写UIScrollView的方法:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

返回YES将允许用户滚动。退回NO不会。

注:这将禁用所有触摸到UIScrollViewpointInside回报NO里面嵌入的任何意见。如果您不想滚动的区域没有任何交互,这很有用。


本示例只允许UIScrollView到当用户滚动通过UITableView滚动。 (A UITableView和两个UIViews是在UIScrollView内嵌入)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    for (UIView *subview in self.subviews) { 
     if ([subview pointInside:[self convertPoint:point toView:subview] withEvent:event] && ![subview isKindOfClass:[UITableView class]]) { 
      return NO; 
     } 
    } 
    return YES; 
}