在 UIScrollView Swift 中禁用垂直滚动

Posted

技术标签:

【中文标题】在 UIScrollView Swift 中禁用垂直滚动【英文标题】:Disable vertical scroll in UIScrollView Swift 【发布时间】:2017-10-04 11:09:37 【问题描述】:

(不要将此问题标记为重复。我阅读了很多问题,但找不到问题的答案。)

我的问题如下:我有一个UIScrollView,它应该只能水平滚动。在这里它垂直滚动 20 像素(奇怪的事实:它似乎与状态栏的高度相同)。

我尝试像这样打印UIScrollView 的内容大小、y 偏移量和高度:

print(horizontalScrollView.contentSize)
print(horizontalScrollView.bounds.size.height)
print(horizontalScrollView.contentOffset.y)

我明白了:

(1125.0, 667.0). // scrollview content size
667.0.           // scrollview height
-20.0            // content offset (y)

我知道scrollView 内容大小高度必须是 scrollView 高度。正如你所看到的那样。

我使用约束将 3 个UIViewController 水平堆叠。除了这个问题,它运行良好。

另一个事实:它在 Swift 4 和 Xcode 9 之前就有效...我不知道这是否是原因。

你有什么想法吗?在此先感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以简单地执行此操作。 斯威夫特 4

self.scrollView.contentSize.height = 1.0 // disable vertical scroll

【讨论】:

欢迎来到 Stack Overflow。感谢您尝试回答问题,请查看:***.com/help/how-to-answer 如果要禁用滚动但保留实际内容偏移量:scrollView.isScrollEnabled = false。将其设置为 TRUE 以再次启用滚动。 @Fox5150 是的,但这也会禁用水平滚动【参考方案2】:

由于 ios 11 内容插图可以自动调整。尝试将滚动视图的行为设置为不对其进行调整。

if #available(iOS 11, *) 
    scrollview.contentInsetAdjustmentBehavior = .never

【讨论】:

【参考方案3】:

非常有魅力的解决方案是:

     // also don't forget
     // YourViewController: UIViewController, UIScrollViewDelegate 

  @IBOutlet weak var scrollView: UIScrollView!

  override func viewDidLoad() 
    super.viewDidLoad()

    self.scrollView.delegate = self
  

  func scrollViewDidScroll(_ scrollView: UIScrollView) 
     if scrollView.contentOffset.y > 0 || scrollView.contentOffset.y < 0 
        scrollView.contentOffset.y = 0
     
  

【讨论】:

完美答案。【参考方案4】:

只需在scrollViewDidScroll中设置contentOffset

if scrollView.contentOffset.y > 0 
    scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0)

【讨论】:

我知道这种方法,但它不干净。还是谢谢。【参考方案5】:

Swift 5

scrollView.isScrollEnabled = false

【讨论】:

【参考方案6】:

使用下一个类,根据需要设置canScroll

class BlockScrollView: UIScrollView 
    var canScroll = true

    override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) 
        if canScroll 
            super.setContentOffset(contentOffset, animated: animated)
        
    

【讨论】:

【参考方案7】:

迅速

self.scrollView.contentSize.width = 1.0 // 禁用垂直滚动

【讨论】:

【参考方案8】:

只添加一行

yourScrollView.bounces = false

并确保您的滚动视图子视图(内容)高度等于您的滚动视图高度 你就完成了

【讨论】:

以上是关于在 UIScrollView Swift 中禁用垂直滚动的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - UITableView 在 UIScrollView 中被切断

快速禁用 UIScrollView 中的垂直滚动?

在 UIScrollView 中禁用 2 指滚动

Objective-C:如何在 UIScrollView 中禁用垂直滚动

在uiscrollview中启用backgroundTap而不禁用uibuttons

在 UIScrollview 中禁用对角线拖动