使用autolayout禁用UIScrollView中的水平滚动

时间:2015-09-11 10:46:21

标签: ios iphone swift uiscrollview autolayout

我想创建只有垂直滚动的视图。事实证明,在iOs中很难做到。我已经完成了这个步骤:

1)在故事板中创建UIViewController;

2)在UIViewController中的View中添加ScrollView,并为每一边添加0个约束。

3)在scrollview中添加元素,结果如下: enter image description here

启动我的应用程序后,所有工作,但是:

1)我应该如何禁用水平滚动?我向右侧添加0约束我的scrollView + 0约束到我的uilabel右侧(因为你在屏幕上看到它没有附加到右边,它有不同的约束,但在属性我设置约束= 0)并且,正如我所想,标签文本应该在我的屏幕边界,但是当我启动应用程序时我可以向右滚动,即可用文本没有换行,我的scrollview只是调整大小以适应文本。我试图设置我的scrollView在代码中:scrollView.contentSize = CGSize(UIScreen.mainScreen().bounds.width, height: 800),但没有帮助。

2)如果我滚动到很多,那么会出现空格,这不是很酷,如何解决?

2 个答案:

答案 0 :(得分:59)

1)当scrollView中的内容宽度超过scrollView的宽度时,水平滚动会自动启用。因此,为了避免水平滚动,必须使scrollView内容的宽度小于或等于scrollView宽度。

Leading spacetrailing space无法为视图设置特定宽度,它们只是拉伸它们。在常规视图中,它们不会超出视图宽度,但scrollView是一个特殊视图,实际上具有无限的内容宽度。因此,scrollView中的trailing spaceleading space约束会将视图宽度更改为其最大可能值(如果使用UILabel,您可以看到调整大小以适合文本)。

为避免水平滚动,您需要设置每个视图的特定宽度,小于或等于scrollView宽度。可以使用width constraints设置特定的视图宽度。

不是设置每个视图宽度,而是更好地添加视图容器并为其设置宽度,并在其中根据需要放置视图。

视图层次结构:

View
    -> ScrollView
        -> ContainerView
            -> UILabel
            -> UILabel
            -> ... other views that you need

Autolayout约束:

ScrollView
    -> leading space to View : 0
    -> trailing space to View : 0
    -> top space to View : 0
    -> bottom space to View : 0

Container View
    -> leading space to ScrollView : 0
    -> trailing space to ScrollView : 0
    -> top space to ScrollView : 0
    -> bottom space to ScrollView : 0
    -> width equal to ScrollView : 0

设置width equal constraint ctrl +从containerView拖动到scrollView

width equal constraint

2)垂直滚动取决于内容的总高度。如果containerView中的最后一个元素具有较大的bottom space to superview值,则可以为空格。

或者你的意思是弹跳效果?您可以禁用scrollView的垂直反弹。

答案 1 :(得分:0)

您也可以在代码中轻松地做到这一点。就我而言,我有一个UIStackView

的唯一子视图
UIScrollView

// Create the stack view let stackView = UIStackView() stackView.translatesAutoresizingMaskIntoConstraints = false // Add things to the stack view.... // Add it as a subview to the scroll view scrollView.addSubview(stackView) // Use auto layout to pin the stack view's sides to the scroll view NSLayoutConstraint.activate([ stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor), scrollView.trailingAnchor.constraint(equalTo: stackView.trailingAnchor), stackView.topAnchor.constraint(equalTo: scrollView.topAnchor), scrollView.bottomAnchor.constraint(equalTo: stackView.bottomAnchor) ]) // Now make sure the thing doesn't scroll horizontally let margin: CGFloat = 40 scrollView.contentInset = UIEdgeInsets(top: margin, left: margin, bottom: margin, right: margin) scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true let stackViewWidthConstraint = stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor) stackViewWidthConstraint.constant = -(margin * 2) stackViewWidthConstraint.isActive = true 位来自Dave DeLong出色的UIView扩展:https://github.com/davedelong/MVCTodo/blob/master/MVCTodo/Extensions/UIView.swift#L26