如何禁用UIScrollView的水平滚动是最佳方式?

8
UIScrollView 中,我的内容高度和宽度大于滚动视图的大小。所以基本上它可以在水平和垂直方向上滚动。我希望只能垂直滚动,并且我使用下面的代码通过一个 UIButton 管理水平滚动。
 [scrlViewQuestion setContentOffset:CGPointMake(questionWidth, 0) animated:YES];

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

8

例如,UIView的宽度应该与UIScrollView的父视图相等,而不是UIScrollView本身。

在这里输入图片描述


2

SWIFT 5 首先,您需要创建一个委托类或通过UIScrollViewDelegate扩展视图控制器,之后,您应该使用scrollViewDidScroll(_:)函数检查内容偏移并使用以下代码禁用它: 这是一个样例代码:

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


1
使用这个视图层次结构和这些约束条件。

enter image description here


图像的逐步解释

将ScrollView放置在一个视图(OuterView)中。

将包含内容的视图(InnerView)放置在ScrollView内部。

将ScrollView的4个边缘与OuterView的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的宽度,而不是ScrollView的宽度。
InnerView.width = OuterView.width

来源


0
将您的滚动视图的contentSize设置为屏幕宽度和可滚动内容的实际高度。将contentInset设置为topbottomright的零。对于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)];

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

0

Swift 4. 设置代理

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

-6

你可以在Storyboard中完成这个操作。

enter image description here

禁用“滚动视图”的“显示水平指示器”选项卡,可以禁用水平滚动功能。

3
这只会禁用滚动条(用户界面),但不会停止实际的滚动交互。 - Henry Heleine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接