Utilisation d'un UIScrollView
Bonjour à tous,
J'ai suivi un petit tutoriel pour savoir utiliser le UIScrollView, celui-ci :
http://www.appcoda.com/uiscrollview-introduction/
je l'ai adapté pour pouvoir l'utiliser dans le cas où l'image n'est pas en locale mais chargée à partir d'une URL, mais cela ne fonctionne pas. En tapant 2 fois sur l'écran l'image ne se redimensionne pas.
Voici le code complet :
import UIKit
class ViewController: UIViewController, UIScrollViewDelegate {
var scrollView: UIScrollView!
var imageView: UIImageView!
let imgURL = URL(string: "http://www.mac4ever.com/images-articles/35292_10-sur-les-macbook-pro-15-avec-touch-bar.jpg")!
override func viewDidLoad() {
super.viewDidLoad()
self.scrollView = UIScrollView(frame: self.view.bounds)
self.scrollView.backgroundColor = UIColor.black
let qualityOfServiceClass = DispatchQoS.QoSClass.background
let backgroundQueue = DispatchQueue.global(qos: qualityOfServiceClass)
backgroundQueue.async(execute: {
DispatchQueue.main.async(execute: { () -> Void in
let session = URLSession(configuration: .default)
let downloadPicTask = session.dataTask(with: self.imgURL) { (data, response, error) in
if let e = error {
print("Error downloading cat picture: \(e)")
} else {
if let res = response as? HTTPURLResponse {
print("Downloaded picture with response code \(res.statusCode)")
if let imageData = data {
self.imageView = UIImageView(image: UIImage(data : imageData))
DispatchQueue.main.async(execute: { () -> Void in
self.scrollView.contentSize = self.imageView.bounds.size
self.scrollView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// self.scrollView.contentOffset = CGPoint(x: 500, y: 250)
self.scrollView.addSubview(self.imageView)
self.view.addSubview(self.scrollView)
self.scrollView.delegate = self
self.setZoomScale()
self.setupGestureRecognizer()
})
} else {
print("Couldn't get image: Image is nil")
}
} else {
print("Couldn't get response code for some reason")
}
}
}
downloadPicTask.resume()
})
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
private func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return imageView
}
func setZoomScale() {
let imageViewSize = imageView.bounds.size
let scrollViewSize = scrollView.bounds.size
print(imageViewSize)
print(scrollViewSize)
let widthScale = scrollViewSize.width / imageViewSize.width
let heightScale = scrollViewSize.height / imageViewSize.height
scrollView.minimumZoomScale = min(widthScale, heightScale)
scrollView.zoomScale = 1.0
print(scrollView.zoomScale)
}
override func viewWillLayoutSubviews() {
guard (imageView) != nil else {
// do something else
return
}
setZoomScale()
}
private func scrollViewDidZoom(scrollView: UIScrollView) {
print("scrollViewDidZoom")
let imageViewSize = imageView.frame.size
let scrollViewSize = scrollView.bounds.size
let verticalPadding = imageViewSize.height < scrollViewSize.height ? (scrollViewSize.height - imageViewSize.height) / 2 : 0
let horizontalPadding = imageViewSize.width < scrollViewSize.width ? (scrollViewSize.width - imageViewSize.width) / 2 : 0
scrollView.contentInset = UIEdgeInsets(top: verticalPadding, left: horizontalPadding, bottom: verticalPadding, right: horizontalPadding)
}
func setupGestureRecognizer() {
print("setupGestureRecognizer")
let doubleTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.handleDoubleTap))
doubleTap.numberOfTapsRequired = 2
scrollView.addGestureRecognizer(doubleTap)
}
func handleDoubleTap(recognizer: UITapGestureRecognizer) {
print("handleDoubleTap")
if (scrollView.zoomScale > scrollView.minimumZoomScale) {
scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
} else {
scrollView.setZoomScale(scrollView.maximumZoomScale, animated: true)
}
}
}
Merci de votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
P.S.: ton code est un gros pâté tout sale. Sépare le chargement de l'image, et ne recrée pas la UIImageView alors que c'est l'image qu'elle affiche qui change.
Salut, je me suis marré tout seul en lisant ton message du genre "il est bien pourri ton code" lol,
mais merci pour tes suggestions, alors en fait ça venait de la méthode :
qui doit être :
Je le sais parce que moi aussi j'ai écrit beaucoup de mauvais code, et que j'ai passé beaucoup de temps à le déboguer. Déboguer est ennuyeux, crée du stress et des délais.
Quand j'en ai eu marre, j'ai cherché des moyens pour éviter de créer les bugs au départ. Le moyen le plus évident est le test automatisé. Je l'ai écrit ici à plusieurs reprises: le développement en TDD (Test-Driven Development) est une excellent école. Pas seulement parce que le code est testé, mais aussi parce que le code doit rester simple pour être facilement testable; ce qui améliore énormément la qualité du code.
Quand je te conseille de séparer la récupération de l'image sur le réseau et son affichage, ce n'est pas par dogme, c'est l'expérience qui parle. Il y a deux fonctions bien distinctes, mieux vaut les séparer pour être sûr qu'elles fonctionnent bien individuellement. Ainsi, le problème est bien localisé, et beaucoup plus facile à trouver.
ah non mais je sais que tu n'as pas dit ça pour te moquer ! je te reproche rien, c'est bien de l'avoir dit et en plus ça m'a fait rire ! c'est tout.