【问题标题】:How to lock the horizontal scrolling of a scrollView in iOS如何在iOS中锁定scrollView的水平滚动
【发布时间】:2011-07-13 09:26:05
【问题描述】:

我有一个滚动视图。我希望它只在一个方向(垂直)滚动。有没有办法可以锁定水平滚动...?? ...

【问题讨论】:

  • 请告诉我们您为什么要这样做,这有助于我们回答问题。

标签: iphone ipad uiscrollview horizontal-scrolling


【解决方案1】:

为您提供相同(改编)的答案:

Disabling vertical scrolling in UIScrollView

对,这里所有的答案都ok...

但是如果由于某种奇怪的原因你的 contentSize 应该高于UIScrollView 在两个维度上,你可以禁用水平滚动实现UIScrollView 协议方法-(void)scrollViewDidScroll:(UIScrollView *)aScrollView

只需将其添加到您的UIViewController

float oldX; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(oldX, aScrollView.contentOffset.y)];
    // or if you are sure you wanna it always on left:
    // [aScrollView setContentOffset: CGPointMake(0, aScrollView.contentOffset.y)];
}

这只是当用户滚动您的UIScrollView 时调用的方法,这样做会强制它的内容始终相同。x

【讨论】:

  • 嘿,我想将它锁定在 Y 方向(因此用户只能水平滚动),当我将 aScrollView.contentOffset.y 更改为 aScrollView.contentOffset.x 时,它不再向任何方向滚动...(你给的那个确实有效)你能帮帮我吗?
  • @ummesekatze: 试试:[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
  • @meronix 非常感谢您提供此解决方案!我已经为这个问题苦苦挣扎了好几天,直到最终找到您的解决方案!我在您的解决方案中添加了更多内容:- (void)scrollViewDidScroll:(UIScrollView *)sender { [scrollView setContentOffset: CGPointMake(oldX, scrollView.contentOffset.y)]; if (sender.contentOffset.x != 0) { CGPoint offset = sender.contentOffset; offset.x = 0; sender.contentOffset = offset; }
【解决方案2】:
self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items);

应该有帮助。我只是通过使用类似的技术水平锁定了滚动视图。

【讨论】:

    【解决方案3】:

    我发现限制滚动视图移动的最安全和最成功的方法是继承 UIScrollView 并覆盖 setContentOffset:animated:setContentOffset : 方法(代码如下)。

    重写这些方法的好处是它在任何 UIKit 代码开始作用于它之前直接改变请求的 contentOffset,避免在修改 contentOffset 时可能发生的任何副作用scrollViewDidScroll: 或其他 UIScrollViewDelegate 方法。

    创建新的子类只需要几分钟,它就像一个魅力。

    - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
        // restrict movement to vertical only
        CGPoint newOffset = CGPointMake(0, contentOffset.y);
        [super setContentOffset:newOffset animated:animated];
    }
    
    - (void)setContentOffset:(CGPoint)contentOffset {
        // restrict movement to vertical only
        CGPoint newOffset = CGPointMake(0, contentOffset.y);
        [super setContentOffset:newOffset];    
    }
    

    【讨论】:

    • 我喜欢这个解决方案,因为您也可以通过将自定义类从 UIScrollView 设置为子类来在 Interface Builder 中使用它。为此 +1。
    【解决方案4】:

    this的问题,你得把可滚动的大小设置成视图对应的大小,这样就没有什么可以滚动的了。

    【讨论】:

      【解决方案5】:

      如果 UIScrollView 的 contentSize 属性与 UIScrollView 的实际宽度相同,则无法水平滚动。

      您想在水平滚动有效时停止水平滚动吗? (即contentSize 比实际的 UIScrollView 宽度更宽?)如果“是”,您为什么要这样做?

      【讨论】:

      • @ occulus:yes occulus.....即使内容大小大于实际的滚动视图宽度,我也想停止它
      • 好的,已经更新了我的答案并问“你为什么要这样做?”。让我知道,因为它会影响策略。
      【解决方案6】:

      你可以试试这个,

      self.ScrollView.contentSize = CGSizeMake(self.ScrollView.frame.size.width, 1450);
      

      这里 1450 是我的视野高度。

      【讨论】:

      • 您标记应该是代码的文本,然后单击代码高亮按钮。或者你用四个空格缩进。这使得文本得到格式化的代码。
      【解决方案7】:

      只有在设置 contentSize 宽度大于 scrollView 框架时,scrollView 才能水平滚动。如果将 contentSize 宽度设置为与滚动视图相同,它将不会滚动。例如

      UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,100,100)] [scrollView setContentSize:CGSizeMake(100, 300)]

      【讨论】:

        【解决方案8】:

        哦,因为 iOS7 使用这个(在 initWithNibName 中):

        self.automaticallyAdjustsScrollViewInsets = NO;
        

        并创建包含 3 个页面的页面滚动条

        self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
        [self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
        [self.pageView setShowsVerticalScrollIndicator:NO];
        [self.pageView setPagingEnabled:YES];
        [self.view addSubview:self.pageView];
        

        【讨论】:

          【解决方案9】:

          在我的情况下 contentSize 高于 x 和 y 的 UIScrollView。对我来说,meronixe 的回答效果很好,但对于我的需求来说还不够完整。不幸的是,水平滚动条仍然可见。

          我可以用下面的代码来改变

          - (void)webViewDidFinishLoad:(UIWebView *)webView
          
          [self.webView.scrollView setShowsHorizontalScrollIndicator:NO];
          

          【讨论】:

            【解决方案10】:

            斯威夫特

            使contentOffset.x = 0 禁用水平滚动

               extension ViewController: UIScrollViewDelegate {
                      func scrollViewDidScroll(_ scrollView: UIScrollView) {
                        scrollView.contentOffset.x = 0//to lock horizontal scrolling
                        //scrollView.contentOffset.y = 0//to lock vertical scrolling
                    }
                }
            

            此外,您可以禁用滚动指示器

              scrollView.showsHorizontalScrollIndicator = false//to disable HorizontalScrollIndicator
                scrollView.showsVerticalScrollIndicator = false//to disable VerticalScrollIndicator
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-08-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多