Reputation: 8078
Scroll View
I have a UIScrollView, with constraints left: 0, top: 0, right: 0, bottom: 0
Inside Scroll View
At the top of this UIScrollView
is a UIImageView
with constraints left: 0, top: 0, right: 0, height: 200
Underneath this I have a UITextView
with constraints left: 0, top: 0, right: 0, bottom: 0
This means the UITextView
will resize with respect to its content, and I set the scrollingEnabled
to false
for the UITextView
.
So, when I run, it almost works perfectly.
The one problem is the UIImageView
takes up about 10% more than the actual screen width. Hence, horizontal scrolling is enabled.
I have tried adding the lines
imageView.frame = CGRect(0, 0, screenSize.width, 200)
scrlView.contentSize.width = screenSize.width
but this makes no difference. I can still scroll horizontally and the Image View still takes up around 10% more than the actual screen width.
Note, I have not set imageView screen width in storyboard, only programatically.
Any ideas?
Upvotes: 29
Views: 57246
Reputation: 2186
You can use
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0
}
Do not use scrollView.contentOffset.x < 0 or > 0 like others have mentioned because it will only stop scroll to one side horizontally and not both.
Upvotes: 1
Reputation: 4646
Like this,
Swift 4.0
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView.contentOffset.x>0 {
scrollView.contentOffset.x = 0
}
}
And, you can set this property:
scrollImg.isDirectionalLockEnabled = true
Upvotes: 30
Reputation: 563
I changed this so that it just returns 0. No need to check at all if you want scroll off.
func scrollViewDidScroll(scrollView: UIScrollView) {
scrollView.contentOffset.x = 0
}
No need for the directional lock.
Upvotes: 28
Reputation: 579
Swift 4
Horizontal Scroll Lock
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.x != 0 {
scrollView.contentOffset.x = 0
}
}
You can change the x to y for vertical scrolling.
Make sure to add UIScrollViewDelegate like this:
class MyViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet var scrollView: UIScrollView!
...
}
And set the delegate for the ScrollView
scrollView.delegate = self
Upvotes: 35
Reputation: 41
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0
}
This stops the scrollview from scrolling towards the leading edge too.
Upvotes: 4
Reputation: 887
If you are using storyboard and autolayout, then you should consider how ScrollView work in Storyboard with autolayout.
Consider the following.
Add a single view on your scrollView with constrains left, right, top, bottom, height, width,
Make the outlet of the width and height
Add your subViews to the view you added in the scrollView
update the width to the screenSize eg: 320 for iPhone5 or 4.
self.viewWidth = SCREEN_WIDTH;
[self.view updateConstraints];
Upvotes: 1