I have a UIImageView
and it has an image larger than the screen size. I have this UIImageView
as a sub view of UIScrollView
. Now, I am unable to scroll down. to view the whole image. But the zooming functionalities are working fine.
@IBOutlet weak var scrollView: UIScrollView!
var imageView = UIImageView();
override func viewDidLoad() {
super.viewDidLoad()
}
func centerScrollViewContents(){
let boundsSize = scrollView.bounds.size
var contentsFrame = imageView.frame
if contentsFrame.size.width < boundsSize.width {
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2
}
else {
contentsFrame.origin.x = 0
}
if contentsFrame.size.height < boundsSize.height {
contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2
}
else {
contentsFrame.origin.y = 0
}
imageView.frame = contentsFrame
// scrollView.frame = contentsFrame
}
func scrollViewDidZoom(scrollView: UIScrollView) {
centerScrollViewContents()
}
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return imageView
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewDidAppear(animated: Bool) {
scrollView.delegate = self
imageView.frame = CGRectMake(0, 0, scrollView.frame.size.width, scrollView.frame.size.height)
// imageView.contentMode = UIViewContentMode.ScaleAspectFill
// imageView.clipsToBounds = true
imageView.image = UIImage(named: imgstr)
var imagee = UIImage(named: imgstr)
let size = imagee?.size
// imageView.frame = CGRectMake(0, 0, size.width!, size.height!)
imageView.contentMode = .Top
scrollView.addSubview(imageView)
scrollView.contentSize = size!
let scrollViewFrame = scrollView.frame
let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
let minScale = min(scaleHeight, scaleWidth)
scrollView.minimumZoomScale = 1
scrollView.maximumZoomScale = 5
scrollView.zoomScale = minScale
centerScrollViewContents()
}
You have to solve two main problems to your UIScrollView
work
UIScrollView
, I mean the function viewDidAppear
.UIScrollView
like Top
, Bottom
, Left
and Right
to 0 respect the your SuperView
. If you put the code inside your viewDidAppear
inside of your function viewDidLoad
and delete your function viewDidAppear
, it works fine as you want. Like in the following way:
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
imageView.frame = CGRectMake(0, 0, scrollView.frame.size.width, scrollView.frame.size.height)
// imageView.contentMode = UIViewContentMode.ScaleAspectFill
// imageView.clipsToBounds = true
imageView.image = UIImage(named: "imgstr.jpg")
var imagee = UIImage(named: "imgstr.jpg")
let size = imagee?.size
// imageView.frame = CGRectMake(0, 0, size.width!, size.height!)
imageView.contentMode = .Top
scrollView.addSubview(imageView)
scrollView.contentSize = size!
let scrollViewFrame = scrollView.frame
let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
let minScale = min(scaleHeight, scaleWidth)
scrollView.minimumZoomScale = 1
scrollView.maximumZoomScale = 5
scrollView.zoomScale = minScale
centerScrollViewContents()
}
You must too set the constraints for the UIScrollView
in your Storyboard
I though that the problem reside in the following difference:
viewDidAppear
is called when the view is actually visible, and can be called multiple times during the lifecycle of a View Controller (for instance, when a Modal View Controller is dismissed and the view becomes visible again). This is where you want to perform any layout actions or do any drawing in the UI - for example, presenting a modal view controller. However, anything you do here should be repeatable. It's best not to retain things here, or else you'll get memory
leaks if you don't release them when the view disappears.viewDidLoad
is called exactly once, when the view controller is first loaded into memory. This is where you want to instantiate any instance variables and build any views that live for the entire lifecycle of this view controller. However, the view is usually not yet visible at this point.If you any problem I have a project ready to submit to Github if you want to see it.
UPDATE: After test it again your code, I resume your error to less code. Your code work fine, if you put your line
imageView.frame = CGRectMake(0, 0, size!.width, size!.height)
your code works fine without contraints.
Something like this :
override func viewDidAppear(animated: Bool) {
scrollView.delegate = self
// imageView.contentMode = UIViewContentMode.ScaleAspectFill
// imageView.clipsToBounds = true
imageView.image = UIImage(named: "imgstr.jpg")
var imagee = UIImage(named: "imgstr.jpg")
let size = imagee?.size
// This line should be here!!!
imageView.frame = CGRectMake(0, 0, size!.width, size!.height)
imageView.contentMode = .Top
scrollView.addSubview(imageView)
scrollView.contentSize = size!
let scrollViewFrame = scrollView.frame
let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
let minScale = min(scaleHeight, scaleWidth)
scrollView.minimumZoomScale = 1
scrollView.maximumZoomScale = 5
scrollView.zoomScale = minScale
centerScrollViewContents()
}
The key is that in your previous code you set the frame
for the image as the frame
of the scrollView
not at the size of the image that is bigger than the scrollView
.
I hope this help you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With