Frage UIScrollView AutoLayout Nur vertikal


Ich möchte mit dem AutoLayout arbeiten UIScrollView und habe ein wenig Ärger damit. Hier ist, was ich getan habe:

  1. Füge hinzu ein UIScrollView in der Hauptansicht mit Rahmen: [oben: 0, links: 0, Breite: 320, Höhe: 568]

  2. Hinzufügen UIView "ContentView" in der UIScrollView mit Rahmen und bgcolor schwarz: [oben: 0, links: 0, Breite: 320, Höhe: 568]

  3. Konfiguration UIScrollView Einschränkungen: [oben: 0, unten: 0, links: 0, rechts: 0]

  4. Setup "ContentView" Einschränkungen: [top: 0, unten: 0, links: 0, rechts: 0]

  5. Richte die Objekte in der "ContentView" aus

  6. Setze Main View bgcolor auf grau (um zu sehen was passiert)

Hier ist ein Screenshot des Problems: http://imgur.com/P8s9lB0

Aus irgendeinem Grund bewirken die Einschränkungen, dass die Inhaltsansicht in der Mitte des Bildschirms angezeigt wird. Außerdem scrollt es in alle Richtungen. Ich möchte, dass der Inhalt nur in vertikaler Richtung gescrollt werden kann wie in UITableView, damit ich es nicht so bewegen kann: http://imgur.com/lBCwfAS

Was mache ich falsch? Ich habe alle Tutorials und Antworten überprüft, die ich in StackOverflow und Google finden kann, und niemand hat wirklich nur ein bizarres Problem, also bitte ich um Hilfe.

EDIT: Ich habe auch die Breite und Höhe von ContentView als Einschränkungen hinzugefügt und das hat auch nicht geholfen.


13
2017-09-22 19:20


Ursprung


Antworten:


Zum Deaktivieren des horizontalen Bildlaufs können Sie die Inhaltsgröße in der (void) scrollViewDidScroll-Methode festlegen.

[self.scrollView setContentOffset: CGPointMake(0, self.scrollView.contentOffset.y)];

Sie möchten auch die Richtungssperre einstellen, so dass jeweils nur 1 Bildlaufrichtung verwendet wird. https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/index.html#//apple_ref/occ/instp/UIScrollView/directionalLockEnabled

self.scrollView.directionalLockEnabled = YES;

16
2017-09-22 19:34



Sie können dies vollständig mit Einschränkungen tun, und es ist wirklich einfach.

Das UIScrollView muss nur verstehen, wie viel Breite und Platz es in sich hat. Es muss also etwas an der Leading, Trailing, Top & Bottom Einschränkungen. Außerdem muss die Breite und Höhe des Inhalts festgelegt werden (dies bedeutet nicht, dass ich es spezifizieren muss. Ich kann immer noch Einschränkungen verwenden, um dies zu erreichen.)

  1. Füge hinzu ein UIScrollView und positionieren Sie wie erforderlich.
  2. Füge hinzu ein UIView innerhalb der UIScrollView für den Inhalt.
  3. Stellen Sie das ein Leading, Trailing, Top & Bottom Einschränkungen des Inhalts UIView um 0 zu sein.
  4. Fügen Sie ein ein Equal Width Beschränkung auf die UIScrollView und UIView. Dadurch wird nur vertikal geblättert.
  5. Sie müssen nun die Höhe des Inhalts festlegen UIView. Sie können dann entweder die Höhe der Inhaltsansicht (blech) angeben oder die Höhe der darin enthaltenen Steuerelemente verwenden, indem Sie sicherstellen, dass das untere Steuerelement am unteren Rand der Inhaltsansicht festgelegt ist.

Ich habe das gemacht und es hat Spaß gemacht.


10
2017-10-09 15:13



Um die Leszek S Antwort zusammenzufassen:

Um eine vertikal scrollende Ansicht zu haben, Alle Ansichten in der Bildlaufansicht müssen ihre haben  Breitenbeschränkung einstellen. Einfach nur auf den Superview der Scroll-Ansicht zu setzen.

Der Grund dafür ist, dass die Bildlaufansicht nicht horizontal geblättert wird, solange keiner der Teilansichten horizontal gescrollt werden muss. Wenn Sie beispielsweise eine Beschriftung auf 0 Zeilen setzen, versucht das automatische Layout, die Beschriftung so breit wie möglich zu machen, bevor Zeilen und Zeilenumbrüche hinzugefügt werden. Wenn das Label keine expliziten Width-Constraints enthält, wird der Content-Bereich der Scroll-Ansicht erweitert. Einschränkungen für das Folgen der Bildlaufansicht werden ignoriert.

Wenn Sie eine Menge Ansichten haben, möchten Sie sie vielleicht in eine einzelne Ansicht einfügen, wie in diesem Video. Für meinen Fall habe ich nur 5 oder 6 Labels, die die Höhe dynamisch ändern können, aber niemals die Breite ändern sollten, also habe ich sie alle gleich breit wie die Scroll-Ansicht gemacht. Und Bingo, vertikal scrollende Ansicht mit Beschriftungen, die je nach Text wachsen oder schrumpfen.


6
2017-08-10 09:09



Ich habe eine Funktion geschrieben, die es erlaubt, Inhalte vertikal, aber nicht horizontal zu scrollen. Es erstellt eine UIView mit begrenzter Breite innerhalb der Bildlaufansicht und bettet alle darin enthaltenen Scrollview-Unteransichten ein.

TegScrolledContent.createContentView(scrollView)

https://github.com/exchangegroup/scrollable-content-ios

enter image description here


3
2017-11-28 02:42



Geben Sie in der Inhaltsansicht explizite Beschränkungen für Höhe und Breite an


1
2017-09-22 19:32



Unten ist ein Ausschnitt, den ich verwendet habe, um eine vertikale Bildlaufansicht zu erzielen. Sie können eine Inhaltsansicht als untergeordnete Ansicht einer Bildlaufansicht hinzufügen und dann die Breite dieser Inhaltsansicht auf die Breite der übergeordneten Bildlaufansicht beschränken. Ab diesem Zeitpunkt sollten alle Unteransichten der Inhaltsansicht und nicht der Bildlaufansicht hinzugefügt werden.

// View that will contain content of scroll view. Width is constrained to the width of the scroll view.
UIView *contentView = [[UIView alloc] init];
contentView.translatesAutoresizingMaskIntoConstraints = NO;
[scrollView addSubview:contentView];

views[@"contentView"] = contentView;
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:views]];

// Now, add all your subviews to contentView

1
2017-09-01 01:32



Zusammen mit @ Dereks Antwort möchte ich die Einstellung contentOffset immer hinzufügen scrollViewDidScroll verursacht Leistungsproblem. Bitte überprüfen Sie nur, ob x 0 ist und setzen Sie dann contentOffset

    if(contentOffset.x != 0){
        setContentOffset(CGPointMake(0, contentOffset.y), animated: false)
    }

und ja zum scrollview

directionalLockEnabled = true

1
2017-12-02 22:55