我想创建只有垂直滚动的视图。事实证明,在iOs中很难做到。我已经完成了这个步骤:
1)在故事板中创建UIViewController;
2)在UIViewController中的View中添加ScrollView,并为每一边添加0个约束。
启动我的应用程序后,所有工作,但是:
1)我应该如何禁用水平滚动?我向右侧添加0约束我的scrollView + 0约束到我的uilabel右侧(因为你在屏幕上看到它没有附加到右边,它有不同的约束,但在属性我设置约束= 0)并且,正如我所想,标签文本应该在我的屏幕边界,但是当我启动应用程序时我可以向右滚动,即可用文本没有换行,我的scrollview只是调整大小以适应文本。我试图设置我的scrollView在代码中:scrollView.contentSize = CGSize(UIScreen.mainScreen().bounds.width, height: 800)
,但没有帮助。
2)如果我滚动到很多,那么会出现空格,这不是很酷,如何解决?
答案 0 :(得分:59)
1)当scrollView中的内容宽度超过scrollView的宽度时,水平滚动会自动启用。因此,为了避免水平滚动,必须使scrollView内容的宽度小于或等于scrollView宽度。
Leading space
和trailing space
无法为视图设置特定宽度,它们只是拉伸它们。在常规视图中,它们不会超出视图宽度,但scrollView是一个特殊视图,实际上具有无限的内容宽度。因此,scrollView中的trailing space
和leading 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
。
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