UIScrollView是否仅在一个方向上禁用滚动?

UIScrollView是否仅在一个方向上禁用滚动?,uiscrollview,Uiscrollview,我一直找不到这个问题的答案(也许有人一起破解了一个解决方案) 是否可以在UIScrollView中禁用单向滚动?我不是说禁用垂直或水平滚动,而是说只禁用一个方向。例如,在UIScrollView中,我希望能够向下拖动scrollview,但不能向上拖动 谢谢你,事实证明一个简单的解决方案是可行且简单的: - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView.contentOffset.y >

我一直找不到这个问题的答案(也许有人一起破解了一个解决方案)

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


谢谢你,事实证明一个简单的解决方案是可行且简单的:

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

另一种选择可能是:

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

    else scrollView.bounces = YES;
}
-(无效)scrollViewDidScroll:(UIScrollView*)scrollView{
if(scrollView.contentOffset.y<10){
scrollView.bounces=否;
}
else scrollView.bounces=是;
}
但请记住,这只适用于ScrollView,因为它的内容比它们的框架更大。

这对我适用:

    -(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;
    }
-(void)ScrollViewDiEndDraging:(UIScrollView*)scrollView将减速:(BOOL)减速{
scrollView.bounces=是;
}
-(无效)scrollViewDidScroll:(UIScrollView*)scrollView{
if(scrollView.contentOffset.y<0){
[scrollView setContentOffset:CGPointMake(0,0)];
scrollView.bounces=否;
}
if(scrollView.contentOffset.y==0){
scrollView.bounces=是;
}
else scrollView.bounces=是;
}

幸运的是,我们可以使用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];
    }
}

上述解决方案会将您重置为零,如果用户意外地垂直滚动,则重置为零。试试这个

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

如果将滚动条的contentSize设置为内容的大小,在其中一个方向上,滚动条将在该方向上消失,因为没有任何内容可滚动。

而不是使用UIScrollViewDelegate来更正已经错误的contentOffset(这将导致抖动行为)您可能需要考虑子类UISCRelVIEW,而不是重写SETCONTRONTROPENS:

- (void)setContentOffset:(CGPoint)contentOffset {
    if (contentOffset.y <= 60) {
        [super setContentOffset:contentOffset];
    }
}
-(void)setContentOffset:(CGPoint)contentOffset{
如果(contentOffset.y这对我很有效

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;
    }
}
静态CGPoint lastOffset;
-(无效)ScrollViewDiEndDecelling:(UIScrollView*)scrollView{
scrollView.scrollEnabled=是;
}
-(无效)scrollView将开始刷新:(UIScrollView*)scrollView{
scrollView.scrollEnabled=是;
lastOffset=scrollView.contentOffset;
}
-(无效)scrollViewDidScroll:(UIScrollView*)scrollView{
CGPoint nowOffset=scrollView.contentOffset;
NSLog(@“增量%f”,lastOffset.x-nowOffset.x);
如果((lastOffset.x-nowOffset.x)<0){
//取消注释以防止向左滚动
//scrollView.scrollEnabled=否;
}如果((lastOffset.x-nowOffset.x)>0,则为else{
//取消注释以防止向右滚动
//scrollView.scrollEnabled=否;
}否则{
scrollView.scrollEnabled=是;
}
}

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

关闭自动布局。只有在禁用自动布局后,我才修复了相同的问题在内容视图中使用yout.Xcode 11.Automatic->Translate Masks to Constraints

awesome answer!显然,在将视图控制器设置为scrollview委托后可以工作。这不会提供问题的答案。若要评论作者或要求作者澄清,请在其帖子下方留下评论。哈。是的,很抱歉。我猜你知道你想看到什么,这是我遇到的问题的答案,但正如我现在看到的,与作者不完全一样。希望它仍然能帮助别人。谢谢,伙计。直接的解决方案。干杯。