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.


Réponses

  • CéroceCéroce Membre, Modérateur
    Essaie


    self.imageView.userInteractionEnabled = true
    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 :



    private func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
    return imageView
    }

    qui doit être :



    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return imageView
    }
  • CéroceCéroce Membre, Modérateur
    décembre 2016 modifié #4

    Salut, je me suis marré tout seul en lisant ton message du genre "il est bien pourri ton code" lol,

    Ma réflexion n'est pas sur le style " je me moque du purisme, et je sais bien que l'apprentissage prend du temps " mais j'ai du mal à  lire ton code. Et toi aussi tu as du mal. C'est essentiellement pour cela que tu ne parviens pas à  déboguer tout seul.

    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.

  • CéroceCéroce Membre, Modérateur
    Alors tant mieux ;-)
Connectez-vous ou Inscrivez-vous pour répondre.