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

54voto

Thiago Monteiro Punkte 660

Sie müssen eine UIView als Unteransicht des UIScrollView erstellen, wie unten beschrieben:

  • UIViewController
  • UIView 'Hauptansicht'
    • UIScrollView
      • UIView 'Containeransicht'
        • [Ihr Inhalt]

Der zweite Schritt ist, die Einschränkungen des UIScrollView festzulegen. Dies habe ich mit den obigen, unteren, führenden und nachfolgenden Einschränkungen zu seinem SuperView gemacht.

Anschließend fügte ich die Einschränkungen für den Container des UIScrollView hinzu und hier beginnt das Problem. Wenn Sie die gleichen Einschränkungen (oben, unten, führend und nachfolgend) festlegen, gibt das Storyboard eine Warnmeldung aus:

"Hat eine unklare Scrollbare-Inhalts-Breite" und "Hat eine unklare Scrollbare-Inhalts-Höhe"

Fahren Sie mit den gleichen Einschränkungen oben fort und fügen Sie einfach die Einschränkungen Gleiche Höhe und Gleiche Breite zu Ihrer Containeransicht im Verhältnis zur Hauptansicht und nicht zu Ihrem UIScrollView hinzu. Mit anderen Worten sind die Einschränkungen der Containeransicht an die Übergeordneteansicht des UIScrollView gebunden.

Danach haben Sie keine Warnungen mehr in Ihrem Storyboard und können mit dem Hinzufügen der Einschränkungen für Ihre Unteransichten fortfahren.

54voto

Yodagama Punkte 3305

Ich hatte das gleiche Problem. Deaktivieren Sie dieses Kontrollkästchen. Da Sie die Inhaltsgröße im Code festlegen. Bildbeschreibung eingeben

23voto

William T. Punkte 12365

Ich habe das endlich herausgefunden, ich hoffe, dass dies einfacher zu verstehen ist.

Man kann diese Warnung oft umgehen, indem man eine Basis-UIView zum ScrollView hinzufügt als "ContentView", wie sie erwähnten und es auf die gleiche Größe wie deinen ScrollView macht und auf diesem Content-View diese 6 Parameter setzt.

Gib hier die Bildbeschreibung ein

Wie du sehen kannst, brauchst du insgesamt 6 Parameter! Was normalerweise dazu führt, dass du 2 Einschränkungen duplizierst, aber das ist der Weg, um diesen Storyboard-Fehler zu vermeiden.

16voto

Borzh Punkte 4778

Ich weiß, ich bin vielleicht spät dran, aber die nächste Lösung löst diese Art von Problemen ohne zusätzlichen Code, indem sie einfach Storyboards verwendet:

Für Ihre Inhaltsansicht müssen Sie Abstände für links/rechts/oben/unten zum Scrollview setzen und dies wird den Rahmen der Inhaltsansicht nicht ändern, wie hier dargestellt: Gib eine Bildbeschreibung hier ein

Natürlich müssen Sie zusätzliche Einschränkungen für die Inhaltsansicht erstellen, damit das Scrollview die Inhaltsgröße kennt. Setzen Sie beispielsweise eine feste Höhe und Zentrierung x.

Hoffe, dies hilft.

10voto

Nick Podratz Punkte 634

Für mich hat es nicht wirklich funktioniert, ein contentView hinzuzufügen, wie vorgeschlagen. Außerdem führt dies zu einem Overhead aufgrund der hinzugefügten Ansicht (obwohl ich das nicht als großes Problem betrachte). Am besten hat es funktioniert, einfach die Ambiguitätsprüfung für meinen scrollView auszuschalten. Alles wird schön angezeigt, also denke ich, dass es in einfachen Fällen wie meinem in Ordnung ist. Aber denken Sie daran, dass Ihnen der Interface Builder nicht mehr bei anderen gebrochenen Einschränkungen für Ihren scrollView warnen wird.

Bildbeschreibung hier eingeben

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