UIScrollView只在一个方向禁用滚动?

时间:2011-03-20 18:16:11

标签: uiscrollview

我一直无法找到答案(也许有人一起破解了一个解决方案)。

是否可以在一个方向上禁用UIScrollView中的滚动?我不是在谈论禁用垂直或水平滚动,而只是一个方向。例如,在UIScrollView中,我希望能够向下拖动滚动视图,但不能向上拖动

由于

10 个答案:

答案 0 :(得分:34)

事实证明,一个简单的解决方案实际上可行且简单:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y > 60) {
        [scrollView setContentOffset:CGPointMake(0, 60)];
    }
}

答案 1 :(得分:8)

这对我有用:

    -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
        scrollView.bounces = YES;
    }

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView{

        if (scrollView.contentOffset.y < 0) {
            [scrollView setContentOffset:CGPointMake(0, 0)];
            scrollView.bounces = NO;
        }

        if (scrollView.contentOffset.y == 0){
            scrollView.bounces = YES;
        }

        else scrollView.bounces = YES;
    }

答案 2 :(得分:5)

幸运的是,我们可以使用scrollRectToVisible来避免滚动受限后的抖动行为:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y > 60) {
        [scrollView setContentOffset:CGPointMake(0, 60)];

        CGFloat pageWidth  = scrollView.frame.size.width;
        CGFloat pageHeight = scrollView.frame.size.height;
        CGRect rect = CGRectMake(0, 0, pageWidth, pageHeight);
        [scrollView scrollRectToVisible:rect animated:YES];
    }
}

答案 3 :(得分:3)

如果用户不小心垂直滚动,上述解决方案会将您重置为零,零。试试这个......

- (void)scrollViewDidScroll:(UIScrollView *) scrollView {
    if (scrollView.contentOffset.y > 0) {
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, 0)];
    }
}

答案 4 :(得分:1)

如果您将滚动条的contentSize设置为等于内容的大小,则在其中一个方向上,滚动将在该方向上消失,因为无法滚动。

答案 5 :(得分:0)

替代方案可能是:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y < 10) {
        scrollView.bounces = NO;
    }

    else scrollView.bounces = YES;
}

但请记住,这只适用于scrollViews,它们的内容比其框架更大。

答案 6 :(得分:0)

而不是使用UIScrollViewDelegate来纠正已经错误的contentOffset(这将导致抖动行为),您可能需要考虑更改子类UIScrollView并覆盖setContentOffset:

- (void)setContentOffset:(CGPoint)contentOffset {
    if (contentOffset.y <= 60) {
        [super setContentOffset:contentOffset];
    }
}

当然,可以通过为内容偏移量的最小或最大允许值添加属性来推广。您可能需要覆盖setContentOffset:animated:。

答案 7 :(得分:0)

这对我有用

static CGPoint lastOffset;

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    scrollView.scrollEnabled = YES;
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    scrollView.scrollEnabled = YES;
    lastOffset = scrollView.contentOffset;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint nowOffset = scrollView.contentOffset;
    NSLog(@"delta %f", lastOffset.x - nowOffset.x);
    if ((lastOffset.x - nowOffset.x) < 0) {
        //uncomment to prevent scroll to left
        //scrollView.scrollEnabled = NO;
    } else if ((lastOffset.x - nowOffset.x) > 0) {
        //uncomment to prevent scroll to right
        //scrollView.scrollEnabled = NO;
    } else {
        scrollView.scrollEnabled = YES;
    }
}

答案 8 :(得分:0)

通过将scrollView.contentSize高度设置为与scrollView.frame.size.height相同的值,可以在垂直方向上删除滚动。任何溢出的内容都将被隐藏。当然也可以限制垂直滚动。

答案 9 :(得分:0)

关闭自动布局。仅在禁用内容视图中的自动布局后,我才解决了相同的问题。 Xcode 11。自动->将蒙版转换为约束