【问题标题】:What is the best way to disable horizontal scroll of UIScrollView?禁用 UIScrollView 水平滚动的最佳方法是什么?
【发布时间】:2018-05-17 18:21:54
【问题描述】:

UIScrollView 中,我的内容高度和宽度大于滚动视图的大小。所以基本上它可以水平和垂直滚动。我想要的是仅垂直滚动,我使用下面的代码使用UIButton 管理水平滚动。

 [scrlViewQuestion setContentOffset:CGPointMake(questionWidth, 0) animated:YES];

防止水平滚动视图,可以将滚动视图内容宽度设置为小于滚动视图大小,但在我的情况下,滚动视图内容宽度大于其大小?那么解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: objective-c uiscrollview horizontal-scrolling contentsize


    【解决方案1】:

    内容 UIView 的宽度应该等于 UIScrollView 的父视图的宽度,而不是 UIScrollView 本身。

    【讨论】:

      【解决方案2】:

      SWIFT 5 首先,您应该创建一个委托类或使用UIScrollViewDelegate 扩展视图控件,然后,您应该使用scrollViewDidScroll(_:) func 检查内容偏移量并使用它禁用它: 这是一个示例代码:

      class ViewController: UIViewController {
        @IBOutlet weak var scrollView: UIScrollView!
          .
          .
          .
       override func viewDidLoad() {
              super.viewDidLoad()
              scrollView.delegate = self 
       }
      }
      
      extension ViewController: UIScrollViewDelegate {
          func scrollViewDidScroll(_ scrollView: UIScrollView) {
              if scrollView.contentOffset.x != 0 {
                  scrollView.contentOffset.x = 0
              }
          }
          
      }
      
      

      【讨论】:

        【解决方案3】:

        使用这个视图层次结构和这些约束


        图片的逐步解释

        将您的 ScrollView 放在视图中(OuterView)。

        将包含您的内容(InnerView)的视图放置在 ScrollView 中

        将 ScrollViews 4 边与 OuterViews 4 边对齐

        ScrollView.leading = OuterView.leading
        ScrollView.trailing = OuterView.trailing
        ScrollView.top = OuterView.top
        ScrollView.bottom = OuterView.bottom
        

        将 InnerViews 4 边与 ScrollViews 4 边对齐

        InnerView.leading = ScrollView.leading
        InnerView.trailing = ScrollView.trailing
        InnerView.top = ScrollView.top
        InnerView.bottom = ScrollView.bottom
        

        将 InnerViews 的宽度和高度设置为 OuterViews 的宽度,NOT ScrollViews 的宽度。

        InnerView.width = OuterView.width
        

        Source

        【讨论】:

          【解决方案4】:

          将滚动视图的contentSize 设置为屏幕宽度和可滚动内容的实际高度。将topbottomrightcontentInset 设置为零。对于left 上的内容插入,请始终选择您当前要显示的位置的否定x 坐标。

          例如如果您的屏幕为 320 点宽,并且您希望显示内容时水平滚动固定为 x,但允许垂直滚动:

          CGFloat screenWidth = 320.0;
          CGSize actualContentSize = CGSizeMake(3000, 3000);
          
          [scrlViewQuestion setContentSize:CGSizeMake(screenWidth, actualContentSize.height)];
          [scrlViewQuestion setContentInset:UIEdgeInsetsMake(0, -x, 0, 0)];
          

          【讨论】:

          • 更准确地说,将contentSize.width 设置为滚动视图的宽度(例如scrollView.bounds.size.width)。但是,如果您使用布局约束,自动布局将在滚动视图运行时重置 contentSize(这可能比您意识到的更频繁),因此在这种情况下,您需要修改您的约束。
          【解决方案5】:

          swift 4. 设置委托

          func scrollViewDidScroll(_ scrollView: UIScrollView) {
              if scrollView.contentOffset.x != 0 {
                  scrollView.contentOffset.x = 0
              }
          }
          

          【讨论】:

            【解决方案6】:

            您可以在情节提要中执行此操作。

            Scroll View 的身份检查器中禁用Show Horizontal Indicator 选项卡。它将禁用您的水平滚动。

            【讨论】:

            • 这只会禁用滚动条(UI),但不会停止实际的滚动交互
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-11-18
            • 2010-11-06
            • 1970-01-01
            • 1970-01-01
            • 2013-01-31
            • 1970-01-01
            • 2012-10-21
            相关资源
            最近更新 更多