禁用UIScrollView Swift中的水平滚动

27

滚动视图

我有一个带有约束条件 left: 0, top: 0, right: 0, bottom: 0UIScrollView

滚动视图内部

在这个 UIScrollView 顶部有一个带有约束条件 left: 0, top: 0, right: 0, height: 200UIImageView

在这个 UIImageView 下面有一个带有约束条件 left: 0, top: 0, right: 0, bottom: 0UITextView

这意味着 UITextView 将根据其内容调整大小,并为 UITextView 设置了 scrollingEnabledfalse

所以,当我运行时,它几乎完美地工作了。

唯一的问题是 UIImageView 占用了比实际屏幕宽度多约10%的空间。因此,启用了水平滚动。

我已经尝试添加以下代码:

imageView.frame = CGRect(0, 0, screenSize.width, 200)
scrlView.contentSize.width = screenSize.width

但这没有任何影响。我仍然可以水平滚动,而且ImageView仍然比实际屏幕宽度多约10%。

请注意,我在Storyboard中没有设置imageView的屏幕宽度,只是以编程方式设置。

有什么想法吗?


1
请执行以下代码:scrlView.contentSize.width = 0; - iphonic
请查看此链接:https://dev59.com/vF4c5IYBdhLWcg3w-OQ4 - Hardik Shekhat
我在过去遇到了很多次相同的问题。我通过在scrollView中使用contentview来解决我的问题。我建议在scrollView中使用uiview作为contentview。基本点是contentView的宽度应该等于scrollView的宽度。所有的imageview、textview等都必须在content view中。 - muhammedkasva
1
通常情况下,如果滚动视图的 contentsize.width <= width,则滚动视图不会滚动,因此,如果您不想进行任何计算,请安全地设置 contentsize.width = 0;,这将确保消除滚动。 - iphonic
6个回答

33

Swift 4

横向滚动锁定

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

您可以将 x 更改为 y 以实现垂直滚动。

请确保像这样添加 UIScrollViewDelegate:

class MyViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet var scrollView: UIScrollView!

    ...
}

设置ScrollView的代理

scrollView.delegate = self

30

就像这样,

Swift 4.0

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

此外,您可以设置这个属性:

scrollImg.isDirectionalLockEnabled = true

完美,它在第一个函数中运行正常。directionLockEnabled 是什么作用? - Greg Peckory
实际上,滚动已经停止了,但imageView仍然太大。 - Greg Peckory
3
你应该加上 scrollView.contentOffset.x < 0,否则答案不错。 - Rashwan L
这绝对应该是HunterCopp在下面的答案(!=0),否则可以斜向左右滚动(上/下)。 - Claytog
最好使用“scrollView.contentOffset.x!= 0”替换“scrollView.contentOffset.x> 0”,以禁用沿x轴的双向滚动。 - nadein
显示剩余2条评论

28
我将其更改为仅返回0。如果您想要滚动关闭,则根本不需要检查。
func scrollViewDidScroll(scrollView: UIScrollView) {
    scrollView.contentOffset.x = 0
}

无需定向锁定。


1
比Loxx的回答更好。 - FredFlinstone
优秀的回答! - user7097242

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

这将阻止滚动视图向前缘滚动。

1

您可以使用

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

不要像其他人提到的那样使用 scrollView.contentOffset.x < 0 或 > 0,因为它只会停止水平滚动到一侧而不是两侧。

1
如果您正在使用Storyboard和自动布局,请考虑ScrollView在带有自动布局的Storyboard中的工作方式。
请考虑以下内容:
1. 在ScrollView上添加一个单一视图,并设置约束条件:左、右、顶部、底部、高度、宽度;
2. 将宽度和高度的outlet与视图连接;
3. 将您的子视图添加到您在ScrollView中添加的视图中。
更新宽度以适应屏幕大小,例如iPhone5或4的320。
self.viewWidth = SCREEN_WIDTH;
[self.view updateConstraints];

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