2009-03-04 14 views
1

Ich habe eine UIScrollView, die ein Bild und ein segmentiertes Steuerelement enthält, mit dem der Benutzer das Bild innerhalb der ScrollView wechseln kann. Wenn ich das Bild einfach innerhalb der UIImageView austausche, wird das neue Bild im gezoomten Zustand angezeigt. Wie setze ich den UIScrollView zurück in den nicht gezoomten Zustand?Wie kann ich ein UIScrollView zurücksetzen (d. H. Zoomen)?

Antwort

2

Ich habe eine detaillierte Diskussion darüber, wie (und warum) UIScrollView Zoomen funktioniert bei github.com/andreyvit/ScrollingMadness/.

(Der Link enthält auch eine Beschreibung, wie UIScrollView programmatisch zoomen, wie Photo Library-Stil Paging + Zoom + Scrollen, ein Beispielprojekt und ZoomScrollView Klasse, die einen Teil der Zoom Magie kapselt. Emulieren)

Quote:

UIScrollView hat keine Vorstellung von einer "aktuellen Zoomstufe", weil jede Unteransicht, die es enthält, eine eigene aktuelle Zoomstufe haben kann. Beachten Sie, dass in UIScrollView kein Feld vorhanden ist, um die aktuelle Zoomstufe beizubehalten. Wir wissen jedoch, dass jemand diese Zoomstufe speichert, da Sie, wenn Sie eine Teilansicht zerren, dann seine Transformation auf CGAffineTransformIdentity zurücksetzen und dann erneut drücken, werden Sie feststellen, dass die vorherige Zoomstufe der Teilansicht wiederhergestellt wurde.

Wenn Sie sich die Disassemblierung ansehen, speichert UIView die eigene Zoomstufe (innerhalb des UIGestureInfo-Objekts, auf das das _gestureInfo-Feld zeigt). Es hat auch eine Reihe von schönen undokumentierten Methoden wie zoomScale und . (Achtung, es gibt auch eine Reihe von rotationsbezogenen Methoden, vielleicht bekommen wir bald Unterstützung für Rotationsbewegungen.)

Wenn wir jedoch eine neue UIView nur zum Zoomen erstellen und unsere echte zoombare Ansicht als hinzufügen Kind, wir beginnen immer mit der Zoomstufe 1.0. Meine Implementierung des programmatischen Zoomens basiert auf diesem Trick.

+1

Es scheint, dass es jetzt eine offizielle 'zoomScale'-Eigenschaft gibt. – BastiBen

0

Wenn Sie Ihre Ansicht nach Abschluss des Pinch-Zoom-Ereignisses nicht neu zeichnen, wird der Zoomfaktor von der transform-Eigenschaft der Ansicht festgelegt, die Sie von der viewForZoomingInScrollView: delegate-Methode zurückgeben. Um diesen Zoom zurückzusetzen, legen Sie den Wert der Umwandlungseigenschaft der Ansicht auf CGAffineTransformIdentity fest.

Beachten Sie jedoch, dass Ihr nächster Pinch-Zoom-Vorgang dort beginnt, wo der vorherige Pinch-Zoom-Vorgang unterbrochen wurde (dh, Ihr neuer Maßstab wird ignoriert). Um dies zu umgehen, müssen Sie möglicherweise einige der von mir beschriebenen Funktionen implementieren here.

+0

also wenn ich die Bilder wechseln, mache ich folgendes: \t imageView.transform = CGAffineTransformIdentity; Hast du das gemeint? Weil es scheint nicht zu wirken. – Bdebeez

+0

Wie wechselst du deine Bilder? Ist Ihre Inhaltsansicht für Ihr UIScrollView das UIImageView? Ist das UIImageView, was Sie dann von viewForZoomingInScrollView zurückgeben? Dies sollte für die Hauptunteransicht der Bildlaufansicht funktionieren. –

+0

Ja, genau so mache ich es. Die Scoll-Ansicht enthält eine Unteransicht - die UIImageView - und ich setze die .image-Eigenschaft auf eine andere UII, wenn sich die Auswahl ändert. – Bdebeez