【问题标题】:Disabling vertical scrolling in UIScrollView在 UIScrollView 中禁用垂直滚动
【发布时间】:2011-07-03 00:22:24
【问题描述】:

IB 中有一个选项可以取消选中滚动视图上的垂直滚动,但它似乎不起作用。

如何在代码而不是IB中将scrollview设置为只水平滚动,而不是垂直滚动?

【问题讨论】:

标签: iphone ios uiscrollview


【解决方案1】:

尝试将 contentSize 的高度设置为 scrollView 的高度。那么垂直滚动应该被禁用,因为没有什么可以垂直滚动。

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);

【讨论】:

  • 你刚刚为我节省了很多时间来调试这个奇怪的问题。谢谢!
  • @fabb 如何知道框架何时更改?
【解决方案2】:

是的,pt2ph8的回答是对的,

但是如果由于某种奇怪的原因你的 contentSize 应该高于 UIScrollView,你可以禁用实现 UIScrollView 协议方法的垂直滚动

 -(void)scrollViewDidScroll:(UIScrollView *)aScrollView;

只需将其添加到您的 UIViewController 中

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

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

这只是用户滚动 UIScrollView 时调用的方法,这样做会强制它的内容始终具有相同的 .y

【讨论】:

  • 天哪!请不要在 .m 文件中声明 oldY 变量,如 float oldY; 参考上面的代码。这是每个应用程序的 C 风格变量符号,该变量必须声明为控制器类的实例成员。
【解决方案3】:

我更新了内容大小以禁用垂直滚动,并且仍然可以滚动。然后我发现我也需要禁用垂直反弹,以完全禁用滚动。

也许有人也有这个问题。

【讨论】:

  • 你救了我。我的 contentSize 和 frame 是一样的,我终生无法弄清楚出了什么问题。非常感谢!
  • 你的答案就是我喜欢stackoverflow的原因! :-) 神圣的烟雾......这让我发疯了!你说的对。就是弹跳效果。我想要反弹效果,但不需要滚动时不需要,所以我现在会根据是否需要滚动在代码中禁用/重新启用该效果。
  • 好的,很容易在运行时启用/禁用 UIScrollView 上的反弹。就我而言,我只关心滚动内容的高度,这就是诀窍:self.scrollView.bounces = (BOOL)(self.scrollView.contentSize.height > self.scrollView.frame.size.height);跨度>
【解决方案4】:

从 iOS7 开始:

首先:内容大小宽度必须等于你的滚动视图的宽度

第二个:在你的 initWithNibName 中:

self.automaticallyAdjustsScrollViewInsets = NO;

就是这样。

【讨论】:

  • 绝妙的解决方案。像魅力一样工作。它会影响我的 ViewController 中其余视图的大小吗? (按钮,标签..)我的意思是,在我的情况下,“self”是一个 UIViewController
  • @voghDev 不,它对滚动视图中的子视图没有影响。
  • Amazing 将此添加到有问题的视图控制器上的 viewdidload 方法中。
  • 如果您使用的是 navigationController 并且您的滚动视图位于 navigationBar 的标题后面,就像我在 viewDidLoad 方法下使用的一样。它解决了。
  • 您可以直接在情节提要设置中实现相同的效果,无需任何代码行。只需选择滚动视图控制器并取消选中属性检查器中的“调整滚动视图插图”即可。
【解决方案5】:

包括以下方法

-(void)viewDidLayoutSubviews{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

并将滚动视图的内容大小宽度设置为等于滚动视图的宽度。

【讨论】:

  • 这也可以在 Storyboard 中通过选择 View Controller 并取消选中该属性来完成
  • 我不喜欢这个,因为它为所有滚动视图都设置了它...希望您可以特定于图表上的一个滚动视图,而无需创建新的 ScrollView 类等
【解决方案6】:
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];

}

你必须已经确认UIScrollViewDelegate

aScrollView.delegate = self;

【讨论】:

    【解决方案7】:

    只需将 y 设置为始终位于顶部即可。 需要符合 UIScrollViewDelegate

    func scrollViewDidScroll(scrollView: UIScrollView) {
            scrollView.contentOffset.y = 0.0
    }
    

    这将保持滚动的减速/加速效果。

    【讨论】:

      【解决方案8】:

      您需要在内容大小中传递 0 以禁用您想要的方向。

      禁用垂直滚动

      scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);
      

      禁用水平滚动

      scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);
      

      【讨论】:

      • 这会将视图的 contentSize 设置为在您设置的轴上为 0。 ContentSize 是指内容的大小,所以我们要传入屏幕的高度来禁用超出该帧的垂直滚动。标记为正确的解决方案是正确的。
      • 这对我来说效果很好。将高度设置为 contentSize 的高度仍然让我垂直滚动。
      • 这对我不起作用。也试过 self.automaticallyAdjustsScrollViewInsets
      • 就是这样!设置为 Scroll View 的高度对我不起作用,但这样做
      【解决方案9】:

      在 iOS 11 上,如果您有兴趣创建一个粘在屏幕边界而不是安全区域的滚动视图,请记得添加以下内容。:

      if (@available(iOS 11.0, *)) {
          [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
      }
      

      【讨论】:

      • 毕竟。谢谢你千倍先生!你拯救了我的一天
      【解决方案10】:

      iOS11 可以使用以下属性

      let frameLayoutGuide: UILayoutGuide
      

      如果您将 frameLayoutGuide.topAnchorframeLayoutGuide.bottomAnchor 的约束设置为 scrollViewsubview 的相同锚点/em> 然后垂直滚动将被禁用,scrollView 的高度将等于其子视图的高度。

      【讨论】:

        【解决方案11】:

        最明显的解决方案是禁止在子类中更改 y 坐标。

        override var contentOffset: CGPoint {
          get {
            return super.contentOffset
          }
          set {
            super.contentOffset = CGPoint(x: newValue.x, y: 0)
          }
        }
        

        这是在以下情况下唯一合适的解决方案:

        1. 您不被允许或只是不想使用委托。
        2. 您的内容高度大于容器高度

        【讨论】:

        【解决方案12】:

        很多答案包括将contentOffset 设置为0。我有一个案例,我希望scrollView 内的视图居中。这为我完成了工作:

        public func scrollViewDidScroll(_ scrollView: UIScrollView) {
            scrollView.contentOffset.y = -scrollView.contentInset.top
        }
        

        【讨论】:

          【解决方案13】:

          我觉得可以

          1. 将 directionalLockEnabled 设置为 true
          2. 设置contentView的宽度等于superView的宽度。

          应该可以的。

          【讨论】:

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