代码之家  ›  专栏  ›  技术社区  ›  Mongus Pong

限制UIScrollView中的可滚动区域

  •  7
  • Mongus Pong  · 技术社区  · 14 年前

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

    我可以通过覆盖scrollViewDidScroll,然后在视图滚动过远时调用setContentOffset来限制区域。但是这样我就不能像UIScrollView在滚动到UIView的边界之外时那样平滑地恢复。

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

    4 回复  |  直到 14 年前
        1
  •  17
  •   trevorsm    14 年前

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

        2
  •  5
  •   Yoko    10 年前

    我找到了对我有用的东西。我们滚动到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)执行同样的操作

        3
  •  0
  •   Johann Burgess    8 年前

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

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

    返回 YES NO 不会的。

    注: 这将禁用对嵌入到 界面视图 那个 pointInside 到。如果您不想从中滚动的区域没有任何交互,则此选项非常有用。


    这个例子只允许 界面视图 UITableView . (一) UITableView公司 还有两个 UIViews 嵌入在 )

    - (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;
    }
    
        4
  •  0
  •   Stoyan    6 年前

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

    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()
        }
    }
    

    scrollViewDidScroll 看看有什么不同。关键是 setContentOffset(_:,animated:) 动画:false 所以 UIViewPropertyAnimator 的块可以捕获它并设置其动画