Ich versuche, eine UIScrollView nur machen läßt in horizontaler Richtung Zoomen. Die Bildlaufansicht wird mit einem reinen automatischen Layoutansatz eingerichtet. Die übliche Vorgehensweise ist, wie in einer Reihe von Stapelüberlauf Antworten (z this one) und other Ressourcen vorgeschlagen. Ich habe dies erfolgreich in Apps verwendet, bevor das automatische Layout vorhanden war. Der Ansatz ist wie folgt: In der Inhaltsansicht des Scroll-Ansicht, ich setTransform()
außer Kraft setzen, und ändern Sie das übergebene Transformation auf der Skala in x-Richtung:Wie UIScrollView Zoom in nur eine Richtung zu machen, wenn
override var transform: CGAffineTransform {
get { return super.transform }
set {
var t = newValue
t.d = 1.0
super.transform = t
}
}
I zurückgesetzt auch den Inhalt der Ansicht blättern versetzt, so dass es doesn ‚t bewegen vertikal während des Zoom:
func scrollViewDidZoom(scrollView: UIScrollView) {
scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: scrollView.frame.height)
scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0.0)
}
Diese sehr schön funktioniert, wenn nicht mit automatischen Layout:
jedoch bei der Verwendung von automatischen Layout, der Inhalt Offset endet falsch up während des Zoomens. Während die Inhaltsansicht nur Skalen in horizontaler Richtung, es bewegt sich vertikal:
Ich habe ein Beispielprojekt setzen on GitHub (verwendet, um die Videos in dieser Frage zu machen). Es enthält zwei Storyboards, Main.storyboard und NoAutolayout.storyboard, die außer dass Main.storyboard identisch ist Automatisches Layout eingeschaltet, während NoAutolayout nicht. Wechseln Sie zwischen ihnen, indem Sie die Projekteinstellung für das Haupt-Interface ändern, und Sie können das Verhalten in beiden Fällen sehen.
Ich würde das automatische Layout lieber nicht abschalten, da es eine Reihe von Problemen bei der Implementierung meiner Benutzeroberfläche auf eine viel nettere Weise löst, als dies beim manuellen Layout der Fall ist. Gibt es eine Möglichkeit, den vertikalen Inhaltsoffset während des Zoomens mit automatischem Layout korrekt (Null) zu halten?
EDIT: Ich habe ein drittes Drehbuch, AutolayoutVariableColumns.storyboard, zum Beispielprojekt hinzugefügt. Dies fügt ein Textfeld hinzu, um die Anzahl der Spalten in der GridView zu ändern, wodurch sich die tatsächliche Inhaltsgröße ändert. Dies zeigt genauer das Verhalten, das ich in der echten App benötige, die diese Frage ausgelöst hat.
Dank Anna, das ist ein interessanter Ansatz, und es scheint, als könnte es gut funktionieren! Ich werde es versuchen und werde es melden. –
Ein schneller Test scheint darauf hinzuweisen, dass dies funktioniert. Ich werde versuchen, es morgen in mein aktuelles Projekt zu integrieren. Danke noch einmal! –
Sicher! Lassen Sie es mich wissen, wenn Sie es zwicken - ich versuche, das gleiche Problem zu lösen. (und achte darauf, dass du meine Antwort akzeptierst ;-) –