swift - example - UIScrollView Zoomen & contentInset



uiscrollview programmatically (1)

Dein Ansatz sieht korrekt aus. Sie müssen Ihren Code wie folgt aktualisieren.

    func scrollViewDidZoom(scrollView: UIScrollView) {

    if scrollView.zoomScale > 1 {

        if let image = imageView.image {

            let ratioW = imageView.frame.width / image.size.width
            let ratioH = imageView.frame.height / image.size.height

            let ratio = ratioW < ratioH ? ratioW:ratioH

            let newWidth = image.size.width*ratio
            let newHeight = image.size.height*ratio

            let left = 0.5 * (newWidth * scrollView.zoomScale > imageView.frame.width ? (newWidth - imageView.frame.width) : (scrollView.frame.width - scrollView.contentSize.width))
            let top = 0.5 * (newHeight * scrollView.zoomScale > imageView.frame.height ? (newHeight - imageView.frame.height) : (scrollView.frame.height - scrollView.contentSize.height))

            scrollView.contentInset = UIEdgeInsetsMake(top, left, top, left)
        }
    } else {
        scrollView.contentInset = UIEdgeInsetsZero
    }
}

https://src-bin.com

Simliar to iOS Photos App, bei der der Benutzer ein Bild mit einem Klick ein- und auszoomt:

UIView> UIScrollView> UIImageView> UIImage

Anfänglich hatte ich das Problem, unter Maßstab 1 zu zoomen: Bild ist nicht zentriert. Ich habe es dadurch behoben:

func scrollViewDidZoom(scrollView: UIScrollView) {
        let offsetX = max((scrollView.bounds.width - scrollView.contentSize.width) * 0.5, 0)
        let offsetY = max((scrollView.bounds.height - scrollView.contentSize.height) * 0.5, 0)
        scrollView.contentInset = UIEdgeInsetsMake(offsetY, offsetX, 0, 0)
}

Dies funktioniert gut beim Herauszoomen.

UIImage content mode ist aspectFit

Problem

Wenn I ZOOM IN , wenn ZoomScale über 1 ist, müssen Bildlaufeinfügungen die Umgebung der UII umarmen, die in der Bildlaufansicht enthalten ist. Das nimmt den toten Raum weg, der das UII-Bild umgab. IE, Fotos App beim Einzoomen durch Kneifen oder Doppeltippen.

Versucht

    func scrollViewDidZoom(scrollView: UIScrollView) {
    if scrollView.zoomScale > 1 {
        let imageScale = (self.imageView.bounds.width/self.imageView.image!.size.width)
        let imageWidth = self.imageView.image!.size.width * imageScale
        let imageHeight = self.imageView.image!.size.height * imageScale
        scrollView.contentInset = UIEdgeInsetsMake(((scrollView.frame.height - imageHeight) * 0.5), (scrollView.frame.width - imageWidth) * 0.5 , 0, 0)
        print (scrollView.contentInset.top)
    }
    else {

        let offsetX = max((scrollView.bounds.width - scrollView.contentSize.width) * 0.5, 0)
        let offsetY = max((scrollView.bounds.height - scrollView.contentSize.height) * 0.5, 0)
        scrollView.contentInset = UIEdgeInsetsMake(offsetY, offsetX, 0, 0)
    }
}

Oberhalb der Zugabe scheint die Einsatzmenge noch zu variieren.

Update (Bilder hinzugefügt)

Das erste Bild zeigt das Standardlayout. Rest zeigt, wenn gezoomt .....





uiedgeinsets