Comment activer l'effet de zoom dans UIScrollView?
Regardez this video
Description de la vidéo:
UIScrollViewDelegate
déléguéUIScrollView
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:
UIScrollViewDelegate
et est défini sur delegate
sur votre instance UIScrollView
.viewForZoomingInScrollView:
(qui doit retourner la vue du contenu pour laquelle vous souhaitez zoomer). Vous pouvez également implémenter scrollViewDidEndZooming:withView:atScale:
éventuellement.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.
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.
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
}
Vérifiez tucan9389/ZoomableScrollView forké à partir de huynguyencong/ImageScrollView.
Créez simplement ZoomableScrollView
et appelez display(view:)
.
import ZoomableScrollView
class ViewController: UIViewController
@IBOutlet weak var zoomableScrollView: ZoomableScrollView!
override func viewDidLoad() {
super.viewDidLoad()
let myView = MyCustomView()
zoomableScrollView.display(view: myView)
}
}