Wie UIScrollView bei Verwendung des automatischen Layouts nur in eine Richtung zoomen kann

Ich versuche, eine UIScrollView zu erstellen, die nur das Zoomen in horizontaler Richtung zulässt. Die Scroll-Ansicht wird mit einem reinen Autolayout-Ansatz eingerichtet. Der übliche Ansatz ist der in einer Reihe von Stack Overflow-Antworten vorgeschlagene (z. B.diese) undander Ressourcen. Ich habe dies erfolgreich in Apps verwendet, bevor es Autolayout gab. Der Ansatz ist wie folgt: In der Inhaltsansicht der Bildlaufansicht überschreibe ichsetTransform(), und ändern Sie die übergebene Transformation so, dass sie nur in x-Richtung skaliert:

override var transform: CGAffineTransform {
    get { return super.transform }
    set {
        var t = newValue
        t.d = 1.0
        super.transform = t
    }
}

Ich habe auch den Inhaltsoffset der Bildlaufansicht zurückgesetzt, damit sie beim Zoomen nicht vertikal rollt:

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)
}

Dies funktioniert sehr gut, wenn kein Autolayout verwendet wird:

Bei Verwendung von Autolayout wird der Inhaltsoffset jedoch beim Zoomen falsch angezeigt. Während die Inhaltsansicht nurWaag in horizontaler Richtung bewegt es sich vertikal:

Ich habe ein Beispielprojekt gesetzton GitHub (verwendet, um die Videos in dieser Frage zu machen). Es enthält zwei Storyboards, Main.storyboard und NoAutolayout.storyboard, die identisch sind, mit der Ausnahme, dass in Main.storyboard Autolayout aktiviert ist, während NoAutolayout dies nicht tut. Wechseln Sie zwischen ihnen, indem Sie die Projekteinstellung für die Hauptschnittstelle ändern. In beiden Fällen wird das Verhalten angezeigt.

Ich würde das automatische Layout lieber nicht ausschalten, da es eine Reihe von Problemen bei der Implementierung meiner Benutzeroberfläche auf eine viel schönere Art und Weise löst, als es beim manuellen Layout erforderlich ist. Gibt es eine Möglichkeit, den vertikalen Versatz des Inhalts (dh Null) beim Zoomen mit Autolayout beizubehalten?

EDIT: Ich habe ein drittes Storyboard, 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 eigentliche Inhaltsgröße ändert. Dies zeigt genauer das Verhalten, das ich in der realen App brauche, die diese Frage gestellt hat.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage