Comprenez-vous ce code du zoom?

LouLou Membre
février 2015 modifié dans API UIKit #1

Salut,


est-ce que vous comprenez la logique du zoom avec ce code :


on commence avec un bounds à  320,538


on double tap, on arrive à  600 et quelques, la photo s'élargit sur l'écran


puis...


le calcul de maths fait que le bounds diminue, et on revient à  320, 538, mais la photo est complètement zoomée. Comment ça se fait? J'aurai imaginé que le bounds.size s'agrandisse de plus en plus, alors qu'il diminue et revient à  ses dimensions de départ (mais la photo a entre temps été complètement élargie) :


 


le résultat :



zoom depart : (320.0,568.0)
newZoomScale 0.46875
scrollViewSize.width, height : 320.0, 568.0
w,h : 682.667 1211.73
newZoomScale 0.703125
scrollViewSize.width, height : 320.0, 568.0
w,h : 455.111 807.822
newZoomScale 1.0
scrollViewSize.width, height : 320.0, 568.0
w,h : 320.0 568.0

Le code :



func scrollViewDoubleTapped(recognizer: UITapGestureRecognizer) {
let pointInView = recognizer.locationInView(imageView)

var newZoomScale = scrollView.zoomScale * 1.5
newZoomScale = min(newZoomScale, scrollView.maximumZoomScale)
println("newZoomScale \(newZoomScale)")

let scrollViewSize = scrollView.bounds.size
let w = scrollViewSize.width / newZoomScale
let h = scrollViewSize.height / newZoomScale
println("scrollViewSize.width, height : \(scrollViewSize.width), \(scrollViewSize.height)")
println("w,h : \(w) \(h)")
let x = pointInView.x - (w / 2.0)
let y = pointInView.y - (h / 2.0)

let rectToZoomTo = CGRectMake(x, y, w, h);
scrollView.zoomToRect(rectToZoomTo, animated: true)
}

//viewDidLoad
let scrollViewFrame = scrollView.frame
let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
let minScale = min(scaleWidth, scaleHeight);
scrollView.minimumZoomScale = minScale;

println("zoom depart : \(scrollView.bounds.size)")

Merci


Réponses

  • CéroceCéroce Membre, Modérateur
    Il doit manquer un peu de contexte pour comprendre ce code, mais je vois qu'y apparaissent à  la fois les rectangles bounds et frame.
  • C'est relativement simple en réalité :


    le zoom peut-être géré avec les propriétés frame et bounds de toute view.


     


    Si frame.size == bounds.size alors zoom = 1:1


    Si frame.size == bounds.size * 2 alors zoom = 1:2


    Si frame.size == bounds.size / 2 alors zoom = 2:1


     


    • Plus la taille de bounds est grande par rapport à  celle de frame plus on dezoome.


    • C'est inversement proportionnel.

  • LouLou Membre
    février 2015 modifié #4

    Alors... je ne comprends pas trop. Ici, on zoome. Et bounds est plus grand que frame, la 1ère fois qu'on zoome. Puis bounds va être tout doucement égal à  frame (Alors que l'image, elle, va être complètement zoomée). Donc :


     


    Si frame.size == bounds.size * 2 alors zoom = 1:2


    Si frame.size == bounds.size / 2 alors zoom = 2:1


     


    Ca devrait être constant, selon cette règle: quand bounds est+ grand, on zoome. Or dans le code, on réduit le bounds, et ça continue de zoomer, jusqu'à  ce que zoomScale soit égale à  1, et que le résultat nous donne 320,538.


     


    Peut-être pour vérifier : le contentSize c'est le bounds? La frame c'est le rectangle qui délimite l'espace visible?


     


    (Est-ce que tu voulais dire : si frame == bounds.size /2, c'est-à -dire, si bounds est grande par rapport à  frame, on "zoome" ?)


Connectez-vous ou Inscrivez-vous pour répondre.