限制UIScrollView中的可滚动区域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了限制UIScrollView中的可滚动区域相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

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

另一答案

我找到了适合我的东西。它让你滚动到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)执行相同的操作

另一答案

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

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

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

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


此示例仅允许NO在用户滚动UIScrollView时滚动。 (在UITableView内嵌有一个UITableView和两个UIViews

UIScrollView
另一答案

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

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

这将使scrollview动画真正类似于它应该做的。当你处于“反弹”区域时,较慢的阻力将无法工作,并且动画持续时间必须取决于距离(不像这里一样),如果你想要精确的话。您也可以尝试在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必须使用动画:false,以便setContentOffset(_:,animated:)的块可以捕获它并为其设置动画

以上是关于限制UIScrollView中的可滚动区域的主要内容,如果未能解决你的问题,请参考以下文章

具有活动和非活动区域的 UIScrollView

为啥 View Controller 在 UIScrollView 上方滚动?

在 UIScrollview 上缩放图像后,它会滚动到图像区域之外

带有两个列表片段的可滚动布局

uiscrollview 中的图像显示

UIScrollview 底部的额外空白区域