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

0voto

johnnyMac Punkte 351

Sie müssen nur sicherstellen, dass es eine Möglichkeit gibt, eine durchgehende Reihe von Einschränkungen von oben nach unten des Scrollview zu erstellen. [-X-X-X]

In meinem Fall - ein horizontal scrollender Scrollview - musste ich auch Breiten- und Höhenbeschränkungen für jedes Kind des Scrollviews hinzufügen, obwohl der technische Hinweis von Apple Ihnen das nicht sagt.

0voto

supergegs Punkte 39

Wie bereits in früheren Antworten erwähnt, sollten Sie eine benutzerdefinierte Ansicht im Scroll-View hinzufügen:

Die benutzerdefinierte Ansicht ist die ContentView, die auf dem Bild markiert ist

Fügen Sie alle Ihre Untersichten zur Inhaltsansicht hinzu. Irgendwann werden Sie eine Warnung sehen, dass die Scroll-Inhaltsansicht eine unklare Inhaltsgröße hat. Sie sollten die Inhaltsansicht auswählen und auf die Schaltfläche "Auto-Layout-Probleme beheben" (unten rechts im IB-Layout) klicken und die Option "Fehlende Einschränkungen hinzufügen" auswählen.

Bildbeschreibung hier eingeben

Ab sofort wird der Scroll-View beim Ausführen des Projekts automatisch seine Inhaltsgröße aktualisieren, kein zusätzlicher Code erforderlich.

0voto

gtl_pm Punkte 165

[getestet in XCode 7.2 und für iOS 9.2]

Was die Unterdrückung der Storyboard-Fehler und Warnungen für mich bewirkt hat, war das Setzen der intrinsischen Größe des Scroll-Views und des Inhalts-Views (in meinem Fall ein Stackview) auf Platzhalter. Diese Einstellung befindet sich im Größen-Inspektor im Storyboard. Und es sagt - Das Festlegen einer Designzeit-intrinsischen Inhaltsgröße betrifft nur eine Ansicht beim Bearbeiten im Interface Builder. Die Ansicht wird diese intrinsische Inhaltsgröße nicht zur Laufzeit haben.

Also, denke ich, dass wir nichts falsch machen, wenn wir das einstellen.

Hinweis: Im Storyboard habe ich alle Ränder des Scrollviews mit dem Superblick verbunden und alle Ränder des Stackviews mit dem Scrollview. In meinem Code habe ich das translatesAutoresizingMaskIntoConstraints sowohl für das Scrollview als auch für das Stackview als falsch festgelegt. Und ich habe keine Inhaltsgröße angegeben. Wenn sich der Stackview dynamisch vergrößert, stellen die im Storyboard festgelegten Einschränkungen sicher, dass der Stack scrollbar ist.

Die Storyboard-Warnung hat mich verrückt gemacht und ich wollte nicht alles horizontal oder vertikal zentrieren, nur um die Warnung zu unterdrücken.

0voto

Ahmed Abdallah Punkte 2183

Xcode 11+, Swift 5.

Laut der Antwort von @WantToKnow habe ich mein Problem gelöst, ich habe ein Video und Code vorbereitet.

0voto

Vinod Joshi Punkte 7388

Ich habe den gleichen Fehler bekommen... ich habe folgendes gemacht

  1. View (Übergeordnetes Element)
  2. ScrollView 0,0,600,600
  3. UIView innerhalb des ScrollViews: 0,0,600,600
  4. UIView enthält ein Bild und ein Label

Fügen Sie jetzt leading/trailing/top/bottom für das ScrollView (2) hinzu, dann für das UIView (3).

Wählen Sie View(1) und View(3) aus und setzen Sie die Höhe und Breite gleich.. das hat mein Problem gelöst.

Ich habe ein Video gemacht, das hilfreich sein könnte:

https://www.youtube.com/watch?v=s-CPN3xZS1A

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