web-dev-qa-db-fra.com

Comment activer le zoom dans UIScrollView

Comment activer l'effet de zoom dans UIScrollView?

49
Ideveloper

Regardez this video

Description de la vidéo:

  • Ajouter UIScrollViewDelegate délégué
  • Prenez une UIScrollView
  • Prenez un UIImageView qui va être ajouté sur Scrollview
  • Placez la vue de défilement dans la fenêtre principale
  • Connecter les délégués
  • Configurer imageView
  • Définir l’échelle de zoom max/min [chose essentielle ici]
  • Implémenter une méthode déléguée pour retourner la vue
10
Jigar Joshi

La réponse est ici :

La vue de défilement gère également le zoom et panoramique du contenu. En tant qu'utilisateur fait un geste pincé ou pincé, la vue de défilement ajuste le décalage et l'ampleur du contenu. Quand le le geste se termine, l'objet gérant le la vue du contenu devrait mettre à jour sous-vues du contenu si nécessaire . (Notez que le geste peut se terminer et qu'un doigt Peut encore être enfoncé.) Pendant que le le geste est en cours, le parchemin view n'envoie aucun appel de suivi à la sous-vue.

La classe UIScrollView peut avoir un délégué qui doit adopter le Protocole UIScrollViewDelegate. Pour zoomer et se déplacer pour travailler, le le délégué doit mettre en œuvre les deux viewForZoomingInScrollView: et scrollViewDidEndZooming: withView: atScale:; en plus, le maximum (zoomZoomScale maximum) et l’échelle de zoom minimum ( minimumZoomScale) doit être différent.

Alors:

  1. Vous avez besoin d'un délégué qui implémente UIScrollViewDelegate et est défini sur delegate sur votre instance UIScrollView.
  2. Sur votre délégué, vous devez implémenter une méthode: viewForZoomingInScrollView: (qui doit retourner la vue du contenu pour laquelle vous souhaitez zoomer). Vous pouvez également implémenter scrollViewDidEndZooming:withView:atScale: éventuellement.
  3. Sur votre instance UIScrollView, vous devez définir les minimumZoomScale et les maximumZoomScale pour qu'ils soient différents (ils sont 1.0 par défaut).

Note: La chose intéressante à ce sujet est ce que vous voulez si interrompre le zoom. Est-il suffisant de renvoyer nil dans la méthode viewForZooming...? Cela interrompt le zoom, mais certains gestes seront confus (pour deux doigts). Par conséquent, pour interrompre le zoom, vous devez définir l’échelle de zoom minimale et maximale sur 1,0.

183
Dan Rosenstark

Lisez ce tutoriel sur Ray Wenderlich:

http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-Swift

Si vous suivez la section "Faire défiler et zoomer une image plus grande", une image s’affichera et vous permettra de pincer et d’agrandir.

Au cas où le lien serait modifié, voici les informations principales: Mettez ce code dans votre contrôleur de vue (ceci définit la fonctionnalité principale):

override func viewDidLoad() {
  super.viewDidLoad()

  // 1
  let image = UIImage(named: "photo1.png")!
  imageView = UIImageView(image: image)
  imageView.frame = CGRect(Origin: CGPoint(x: 0, y: 0), size:image.size)
  scrollView.addSubview(imageView)

  // 2
  scrollView.contentSize = image.size

  // 3
  var doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "scrollViewDoubleTapped:")
  doubleTapRecognizer.numberOfTapsRequired = 2
  doubleTapRecognizer.numberOfTouchesRequired = 1
  scrollView.addGestureRecognizer(doubleTapRecognizer)

  // 4
  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;

  // 5
  scrollView.maximumZoomScale = 1.0
  scrollView.zoomScale = minScale;

  // 6
  centerScrollViewContents()
}

Ajoutez ceci à la classe:

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.0
  } else {
    contentsFrame.Origin.x = 0.0
  }

  if contentsFrame.size.height < boundsSize.height {
    contentsFrame.Origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0
  } else {
    contentsFrame.Origin.y = 0.0
  }

  imageView.frame = contentsFrame
}

Et puis ceci si vous voulez que le geste du double tap soit reconnu:

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

  // 2
  var newZoomScale = scrollView.zoomScale * 1.5
  newZoomScale = min(newZoomScale, scrollView.maximumZoomScale)

  // 3
  let scrollViewSize = scrollView.bounds.size
  let w = scrollViewSize.width / newZoomScale
  let h = scrollViewSize.height / newZoomScale
  let x = pointInView.x - (w / 2.0)
  let y = pointInView.y - (h / 2.0)

  let rectToZoomTo = CGRectMake(x, y, w, h);

  // 4
  scrollView.zoomToRect(rectToZoomTo, animated: true)
}

Si vous voulez plus de détails, lisez le didacticiel, mais cela le couvre assez bien.

8
lg365

Assurez-vous de définir votre viewController en tant que délégué scrollViews et implémentez:

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return imageView
}
0
Menno

Vérifiez tucan9389/ZoomableScrollView forké à partir de huynguyencong/ImageScrollView.
Créez simplement ZoomableScrollView et appelez display(view:).

DEMO

DEMO

Usage

import ZoomableScrollView

class ViewController: UIViewController

    @IBOutlet weak var zoomableScrollView: ZoomableScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let myView = MyCustomView()
        zoomableScrollView.display(view: myView)
    }
}
0
tucan9389