623 Stimmen

UIScrollView Scrollable Content Size Ambiguity UIScrollView Größenambiguität des scrollbaren Inhalts

Liebe Entwickler, ich habe Probleme mit AutoLayout in Interface Builder (Xcode 5 / iOS 7). Es ist sehr grundlegend und wichtig, daher denke ich, dass jeder wissen sollte, wie das ordnungsgemäß funktioniert. Wenn dies ein Bug in Xcode ist, ist es ein kritischer!

Also, immer wenn ich eine Ansichtshierarchie wie diese habe, gerate ich in Schwierigkeiten:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (oder jedes andere vergleichbare UIKit-Element)

Der UIScrollView hat feste Einschränkungen, z.B. 50 px von jeder Seite (kein Problem). Dann füge ich eine Top Space-Einschränkung zum UILabel hinzu (kein Problem) (und ich kann sogar Höhe / Breite des Labels anheften, ändert nichts, sollte aber aufgrund der intrinsischen Größe des Labels unnötig sein)

Die Schwierigkeiten beginnen, wenn ich eine trailing-Einschränkung zum UILabel hinzufüge:

Z.B. Abstand am Ende zu: Superview Gleich: 25

Jetzt treten zwei Warnungen auf - und ich verstehe nicht warum:

A) Scrollbare Inhaltsgrößenambiguität (Scroll View hat eine unklare scrollbare Inhaltsgröße)

B) Falsch platzierte Ansichten (Label Erwartet: x= -67 Tatsächlich: x= 207

Ich habe dieses minimale Beispiel in einem ganz neuen Projekt gemacht, das Sie herunterladen können, und ich habe einen Screenshot angehängt. Wie Sie sehen können, erwartet der Interface Builder, dass das Label außerhalb der Grenze des UIScrollView sitzt (das orangefarbene gestrichelte Rechteck). Das Aktualisieren des Rahmens des Labels mit dem Resolve Issues Tool bewegt es genau dahin.

Bitte beachten Sie: Wenn Sie den UIScrollView durch eine UIView ersetzen, ist das Verhalten wie erwartet (der Rahmen des Labels ist korrekt und gemäß der Einschränkung). Es scheint also entweder ein Problem mit UIScrollView zu geben oder ich übersehe etwas Wichtiges.

Wenn ich die App ausführe, ohne den Rahmen des Labels wie von IB vorgeschlagen zu aktualisieren, wird es genau richtig positioniert, genau dort, wo es sein sollte, und der UIScrollView ist scrollbar. Wenn ich den Rahmen aktualisiere, ist das Label nicht zu sehen und der UIScrollView scrollt nicht.

Hilf mir Obi-Wan Kenobi! Warum das uneindeutige Layout? Warum die falsch platzierte Ansicht?

Sie können das Beispielsprojekt hier herunterladen und sehen, ob Sie herausfinden können, was passiert: https://github.com/Wirsing84/AutoLayoutProblem

Illustration des Problems im Interface Builder

7voto

Gent Punkte 201

Ansatz für Swift 4+:

1) Setze die oberen, unteren, linken und rechten Ränder des UIScrollView auf 0

2) Füge im UIScrollView eine UIView hinzu und setze die oberen, unteren, linken und rechten Ränder auf 0 (gleich den Rändern des UIScrollView).

3) Der wichtigste Teil ist die Festlegung von Breite und Höhe, wobei die Höhenbeschränkung eine niedrige Priorität haben sollte.

private func setupConstraints() {

    // Constraints für scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints für containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}

6voto

Mike Simz Punkte 3914

Schauen Sie sich dieses wirklich schnelle und auf den Punkt gebrachte Tutorial an, wie Sie die Scroll-Ansicht mit Auto Layout zum Funktionieren bringen und vollständig scrollbar machen. Jetzt ist das einzige, was mich noch verwirrt, warum die Inhaltsgröße der Scroll-Ansicht immer größer ist als notwendig..

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/

3voto

Ravi Kumar Punkte 1319

Siehe unten: Inhaltsansicht im Scrollview vertikal und horizontal zentriert. Sie haben einen Mehrdeutigkeitsfehler, stellen Sie immer sicher, dass zwei Dinge aus Ihrer Inhaltsansicht in das Scrollview eingefügt werden: 1). Button-Abstand zum Container. 2) Trailing Space zum Constraint, das im Screenshot markiert ist,

Diese Constraints bedeuten im Scrollview, wie weit Sie nach der Höhe oder Breite Ihrer Inhaltsansicht scrollen können.

geb hier die Bildbeschreibung ein

Es könnte Ihnen helfen.

3voto

Linh Dao Punkte 973

Ich habe dieses Problem für meine Ansicht gelöst, indem ich "Auto Layout-Probleme beheben" > "Fehlende Einschränkungen hinzufügen" für die ausgewählte Ansicht verwendet habe Bildbeschreibung hier eingeben

Die folgenden beiden Einschränkungen lösen mein Problem:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

wobei: trailing, bottom die trailing, bottom von UIScrollView sind

3voto

Spiridon Kopicl Punkte 89

Verwenden von contentView (UView) als Container innerhalb von UIScrollView, der an den Rändern (top, bottom, trailing, leading) des übergeordneten Fensters (UIScrollView) haftet und contentView sollte gleiche Breite und gleiche Höhe wie das übergeordnete Fenster haben. Das sind Einschränkungen. Und der Aufruf der Methode:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

Hat die Probleme für mich gelöst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X