Der folgende Swift-Code ermöglicht das Zoomen innerhalb eines UIImage
innerhalb eines UIScrollView
.Vergrößern eines Bildes vom Benutzerkontaktpunkt mit UIScrollView in Swift
Beim Doppeltippen zoomt das Bild in die Mitte und zoomt in die Mitte.
Frage:
Welche Code-Änderungen müssen den Zoom in Punkt setzen vorgenommen werden das Zentrum des Bildbereichs zu sein, der Benutzer auf dem Bildschirm berührt?
(zum Beispiel, wenn der Benutzer doppelt tippt die obere linke Ecke des Bildes, das Bild entsprechend in die obere linken Ecke des Bildes vergrößern würde.)
class ScrollViewController: UIViewController, UIScrollViewDelegate {
var scrollView: UIScrollView!
var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView = UIImageView(image: UIImage(named: "image.png"))
scrollView = UIScrollView(frame: view.bounds)
scrollView.backgroundColor = UIColor.blackColor()
scrollView.contentSize = imageView.bounds.size
scrollView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
scrollView.contentOffset = CGPoint(x: 1000, y: 450)
scrollView.addSubview(imageView)
view.addSubview(scrollView)
scrollView.delegate = self
setZoomScale()
setupGestureRecognizer()
}
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return imageView
}
override func viewWillLayoutSubviews() {
setZoomScale()
}
func setZoomScale() {
let imageViewSize = imageView.bounds.size
let scrollViewSize = scrollView.bounds.size
let widthScale = scrollViewSize.width/imageViewSize.width
let heightScale = scrollViewSize.height/imageViewSize.height
scrollView.minimumZoomScale = min(widthScale, heightScale)
scrollView.zoomScale = 1.0
}
func scrollViewDidZoom(scrollView: UIScrollView) {
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() {
let doubleTap = UITapGestureRecognizer(target: self, action: "handleDoubleTap:")
doubleTap.numberOfTapsRequired = 2
scrollView.addGestureRecognizer(doubleTap)
}
func handleDoubleTap(recognizer: UITapGestureRecognizer) {
if (scrollView.zoomScale > scrollView.minimumZoomScale) {
scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
} else {
scrollView.setZoomScale(scrollView.maximumZoomScale, animated: true)
}
}
}
Danke @Wei Jay für die Veröffentlichung Ihrer Antwort. Leider funktioniert das nur, wenn der 'UIScrollView' Inhalt enthält, der mit der Bildschirmgröße identisch ist. Es funktioniert zum Beispiel nicht für ein 'UIImageView', das breiter, höher oder gezoomt auf dem Bildschirm ist. Wenn Sie diesen größeren Inhaltstyp doppelt antippen, ist das Zoomen auf den berührten Punkt nicht korrekt, sondern zoomt auf einen anderen Teil des Inhalts. Ich werde basteln, aber wenn Sie irgendwelche anderen Vorschläge haben, bitte aktualisieren Sie den Code? Vielen Dank. Prost. – user4806509
@ user4806509 Ich versuche das auch in Swift 3 herauszufinden. Irgendwas Glück? –