限制UIScrollView中的可滚动区域

时间:2010-10-19 23:00:06

标签: iphone uiscrollview

我有一个滚动相当大的UIView的UIScrollView。

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

我可以通过覆盖scrollViewDidScroll来限制区域,然后在视图滚动太远的情况下调用setContentOffset。但是这样我就无法像UIScrollView那样顺利地反弹,当滚动超出UIView的界限时可以自然地做到。

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

4 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:5)

我找到了对我有用的东西。它让你滚动到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 :(得分:0)

另一种方法是覆盖UIScrollView的方法:

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

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

注意:这将禁用UIScrollView返回pointInside的{​​{1}}内嵌入的任何视图的所有触摸。如果您不想滚动的区域没有任何互动,则非常有用。

此示例仅允许NO在用户滚动UIScrollView时滚动。 (UITableView)内嵌{UITableViewUIViews {/ p>}

UIScrollView

答案 3 :(得分:0)

Yoko在Swift 4中的答案有一个小改进

override func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y > 600 {
        let anim = UIViewPropertyAnimator(duration: 1, dampingRatio: 0.5) {
            scrollView.isScrollEnabled = false
            scrollView.setContentOffset(CGPoint(x: 0, y: 600), animated: false)
            scrollView.isScrollEnabled = true
        }
        anim.startAnimation()
    }
}

这将使scrollview的动画效果与应做的动画非常相似。当您位于“弹跳”区域时,较慢的拖动将不起作用,并且如果要精确的话,动画持续时间必须取决于距离(此处不是常数)。您也可以尝试在scrollViewDidScroll中执行此逻辑,并查看其差异。关键是setContentOffset(_:,animated:)必须具有 animated:false ,以便UIViewPropertyAnimator的图块可以捕获它并对其进行动画处理