Frage

Ich habe eine Instanz von UIScrollView eine Instanz UIView enthalten. Der UIView ist nur ein Container für eine horizontale Anordnung von UIImageView Instanzen. - Zooming wird von UIScrollView und UIScrollViewDelegate zur Verfügung gestellt. Ich möchte nur ohne vertikalen Masstab überhaupt entlang der horizontalen Achse auftreten Zoomen beschränken. Wie ich das tun?

Gibt es eine Möglichkeit, zum Beispiel UIView Unterklasse und die entsprechende Methode außer Kraft setzen vertikale Skalierung zu verhindern? Ich mag diesen Ansatz, aber ich bin nicht klar, welche Methode außer Kraft zu setzen und was die überschriebene Methode sollte eigentlich tun.

Cheers, Doug

War es hilfreich?

Lösung

Ähnlich dem, was ich beschreiben in , können Sie eine UIView Unterklasse erstellen und die -setTransform außer Kraft setzen: Accessormethode die Transformation, die die UIScrollView anzupassen versucht, auf Ihre UIView anzuwenden. Setzen Sie diese UIView Ihre Inhalte Subviews Gastgeber und die Subview des UIScrollView zu machen.

Innerhalb Ihrer außer Kraft gesetzt -setTransform :, Sie werden in der Transformation nehmen müssen, dass die UIScrollView möchte es anzuwenden und anzupassen, so dass der Skalierungseffekt nimmt nur in eine Richtung. Von der Dokumentation, wie CGAffineTransform Matrizen konstruiert sind, glaube ich, die folgende Umsetzung Ihrer Skalierung begrenzen sollte nur entlang der horizontalen Richtung zu sein:

- (void)setTransform:(CGAffineTransform)newValue;
{
 CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
 constrainedTransform.a = newValue.a;
 [super setTransform:constrainedTransform];
}

Andere Tipps

Mit O 3.0 können Sie den Zoom sagen zu einem rect im Scroll zu vergrößern. Ich habe dies in meiner Logik, die Taps erkennt.

CGRect zoomRect = [self zoomRectForScale:newScale withCenter:CGPointMake(tapPoint.x, tapPoint.y) inScrollView:scrollView];
[scrollView zoomToRect:zoomRect animated:YES];

Die für den anderen Teil, werden Sie Ihre Bildansichten durch das Verhältnis, dass der neue Rahmen hat gegen die ursprünglichen strecken müssen, und zentrieren sie im gleichen Mittelpunkt. Sie können in einer Animation tun dies die gleiche wie die Zoom-Animation zeitlich so abgestimmt, dass es gut aussieht, aber ich denke, das wird der einzige Weg, es zu tun.

In scrollViewDidZoom: , stellen Variablen Ihre Inhalte nach Ansicht der basierend auf zoomScale , setzen Sie zoomScale bis 1,0, dann tun setNeedsDisplay auf den Inhalt Ansicht. Behandeln Sie den tatsächlichen Zoom (in welcher Richtung auch immer Sie wollen) in Ihrem Inhalt nach Ansicht der drawRect:.

Das hässliche Detail:

  1. Während der Zoom im Gang ist, die UIScollView Änderungen Content und contentScale , so jene vor Werten in scrollViewWillBeginZooming speichern: und in scrollViewDidZoom:. , so dass Sie eine neue berechnen kann content~~POS=TRUNC Sie sich nach der Zoom

  2. Da Ändern zoomScale wird sofort ein anderes Feuer scrollViewDidZoom: , müssen Sie eine BOOL vor (und Gestochere) Zurücksetzen der gesetzt zoomScale . Testen Sie die BOOL zu Beginn der scrollViewDidZoom:. und zurück, wenn true

  3. Sie müssen möglicherweise hemmen scrollViewDidScroll: , während der Zoomvorgang (Test einen BOOL; legen Sie es in scrollViewWillBeginZooming: und deaktivieren Sie es in scrollViewDidEndZooming:. ), um Ihre eigenen contentOffsets verwendet werden, während der Zoom läuft

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top