【问题标题】:UIScrollView disable scrolling in just one direction?UIScrollView 禁用仅向一个方向滚动?
【发布时间】:2011-07-19 05:33:11
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: uiscrollview


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,伙计。直截了当的解决方案。干杯。
    【解决方案2】:

    另一种可能是:

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

    但请记住,这仅适用于滚动视图,它们的内容比它们的框架更大。

    【讨论】:

      【解决方案3】:

      这对我有用:

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

      【讨论】:

      • 很棒的答案!在将 View Controller 设置为 scrollview 委托后显然可以工作。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          如果你设置滚动条的contentSize等于内容的大小,在其中一个方向上,滚动条会在那个方向上消失,因为没有东西可以滚动。

          【讨论】:

            【解决方案7】:

            与其使用 UIScrollViewDelegate 来纠正已经错误的 contentOffset(这将导致抖动行为),不如考虑改为子类 UIScrollView 并覆盖 setContentOffset:

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

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

            【讨论】:

              【解决方案8】:

              这对我有用

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
                • 哈。真的,对此感到抱歉。我猜你看到了你想看到的,这就是我遇到的问题的答案,但正如我现在所看到的,与作者并不完全相同。希望它仍然可以帮助某人。
                【解决方案10】:

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

                【讨论】:

                  猜你喜欢
                  • 2012-06-15
                  • 2012-07-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-03-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-08-26
                  • 2013-12-13
                  相关资源
                  最近更新 更多