Kollegen, ich habe Probleme mit AutoLayout in Interface Builder (Xcode 5 / iOS 7). Es ist sehr einfach und wichtig, daher denke ich, dass jeder wissen sollte, wie das richtig funktioniert. Wenn dies ein Fehler in Xcode ist, ist es ein kritischer!
Wenn ich also eine solche Ansichtshierarchie habe, stoße ich auf folgende Probleme:
>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)
Das UIScrollView hat feste Einschränkungen, z. B. 50 Pixel von jeder Seite (kein Problem). Dann füge ich dem UILabel eine Top Space-Einschränkung hinzu (kein Problem) (und ich kann sogar Höhe / Breite des Etiketts anheften, ändert nichts, sollte aber aufgrund der Eigengröße des Etiketts nicht erforderlich sein)
Das Problem beginnt, wenn ich dem UILabel eine nachfolgende Einschränkung hinzufüge:
Beispiel: Leerzeichen nach: Übersicht Gleich: 25
Jetzt treten zwei Warnungen auf - und ich verstehe nicht warum:
A) Mehrdeutigkeit der Größe des scrollbaren Inhalts (Die Bildlaufansicht weist eine mehrdeutige Höhe / Breite des scrollbaren Inhalts auf.)
B) Falsch platzierte Ansichten (Beschriftung erwartet: x = -67 Ist: x = 207
Ich habe dieses minimale Beispiel in einem neuen Projekt gemacht, das Sie herunterladen können, und einen Screenshot angehängt. Wie Sie sehen können, erwartet Interface Builder, dass sich das Label außerhalb der Grenze von UIScrollView befindet (das orange gestrichelte Rechteck). Wenn Sie den Rahmen des Etiketts mit dem Tool zum Beheben von Problemen aktualisieren, wird er genau dorthin verschoben.
Bitte beachten Sie: Wenn Sie die UIScrollView durch eine UIView ersetzen, ist das Verhalten wie erwartet (der Rahmen des Etiketts ist korrekt und entspricht der Einschränkung). Es scheint also entweder ein Problem mit UIScrollView zu geben, oder ich verpasse etwas Wichtiges.
Wenn ich die App starte, ohne den von IB vorgeschlagenen Rahmen des Labels zu aktualisieren, ist sie genau dort positioniert, wo sie sein soll, und die UIScrollView ist scrollbar. Wenn ich den Frame aktualisiere, ist das Label nicht sichtbar und die UIScrollView scrollt nicht.
Hilf mir, Obi-Wan Kenobi! Warum das mehrdeutige Layout? Warum die verlegte Ansicht?
Sie können das Beispielprojekt hier herunterladen und versuchen, herauszufinden, was los ist: https://github.com/Wirsing84/AutoLayoutProblem
UIScrollView
direkt zu verwenden. Verwenden Sie stattdessenUICollectionView
oderUITableView
so viel wie möglich, meistens ist mit diesem Element alles möglich und es gibt auch Einfachheit, Lesbarkeit und Wiederverwendbarkeit !!!Antworten:
Also habe ich einfach so aussortiert:
Innerhalb des
UIScrollView
Add aUIView
(wir können das nennencontentView
);In dieser
contentView
, Settop, unteren, linken und rechten Rand auf 0 (natürlich von derscrollView
dem diesuperView
);Stellen Sie auch die Mitte horizontal und vertikal aus .Fertig .
Jetzt können Sie alle Ihre Ansichten hinzufügen
contentView
, und diecontentSize
derscrollView
automatisch entsprechend mit der Größe verändert werdencontentView
.Aktualisieren:
Einige Sonderfälle werden in diesem Video behandelt, das von @Sergio in den Kommentaren unten gepostet wurde .
quelle
Es dauerte eine Weile, bis ich diesen Fehler gefunden hatte. Zunächst habe ich versucht, die Größe des ScrollView festzuhalten, aber in der Fehlermeldung steht eindeutig "Inhaltsgröße". Ich habe sichergestellt, dass alles, was ich oben in der ScrollView angeheftet habe, auch unten angeheftet ist. Auf diese Weise kann ScrollView die Höhe des Inhalts berechnen, indem die Höhe aller Objekte und Einschränkungen ermittelt wird. Dies löste die mehrdeutige Höhe des Inhalts, die Breite ist ziemlich ähnlich ... Anfangs hatte ich die meisten Dinge X in der ScrollView zentriert, aber ich musste die Objekte auch an der Seite der ScrollView anheften. Ich mag das nicht, weil das iPhone6 möglicherweise einen breiteren Bildschirm hat, aber den Fehler "Mehrdeutige Inhaltsbreite" beseitigt.
quelle
Xcode 11+
Der einfachste Weg mit
autolayout
:UIScrollView
es hinzu0,0,0,0
und heften Sie es an die Übersicht (oder Ihre gewünschte Größe).UIView
in ScrollView hinzu, stecken Sie es0,0,0,0
an alle 4 Seiten und zentrieren Sie eshorizontally
undvertically
.bottom
und diealign center Y
Priorität auf 250. (für horizontalen Bildlaufwechseltrailing
undalign center X
)UIScrollView
, wählen Sie den Größeninspektor aus und deaktivieren Sie die OptionContent Layout Guides
.quelle
Es ist die Antwort auf meine selbst beantwortete Frage UIScrollView + Centered View + Ambigous Scrollable Content Size + viele iPhone-Größen .
Aber es deckt auch Ihren Fall vollständig ab!
Hier ist also der Ausgangszustand für den einfachsten Fall:
Has ambiguous scrollable content width
undHas ambiguous scrollable content height
.Alles was wir tun müssen ist:
Wichtig: Sie müssen nachgestellte und / oder untere Einschränkungen hinzufügen . Nicht "führend und top" - es funktioniert nicht!
Sie können es in meinem Beispielprojekt überprüfen , das zeigt, wie dieses Problem behoben werden kann.
PS
Laut Logik sollte diese Aktion "widersprüchliche Einschränkungen" verursachen. Aber nein!
Ich weiß nicht, warum es funktioniert und wie Xcode erkennt, welche Einschränkung mehr Priorität hat (da ich für diese explizite Einschränkung keine Priorität festgelegt habe). Ich bin dankbar, wenn jemand erklärt, warum es in den Kommentaren unten funktioniert.
quelle
Xcode 11+, Swift 5
Wenn Sie sich fragen, warum nicht alle Antworten mehr funktionieren, stellen Sie sicher, dass Sie die Inhaltsansicht (die Sie in die Bildlaufansicht eingefügt haben) im Inhaltslayout-Handbuch der Bildlaufansicht und NICHT im Rahmenlayout-Handbuch angeheftet haben.
Die Kanten der Inhaltsansicht (führende, nachfolgende, obere, untere) sollten nicht wie die führenden im Bild fixiert sein - zum Rahmenlayout-Handbuch
aber so - zum Inhaltslayout-Handbuch.
Und dann funktionieren die meisten Antworten für Sie.
Der einfachste Ansatz sieht jetzt so aus:
Insgesamt sieht Ihre Struktur in der einfachsten Implementierung so aus
quelle
Sie müssen eine
UIView
als Unteransicht der folgenden erstellenUIScrollView
:UIViewController
UIView
'Hauptansicht'UIScrollView
UIView
'Containeransicht'Der zweite Schritt besteht darin, die
UIScrollView
Einschränkungen vorzunehmen . Ich habe dies mit den oberen, unteren, führenden und nachfolgenden Einschränkungen für die SuperView getan.Als nächstes habe ich die Einschränkungen für den Container von hinzugefügt
UIScrollView
und hier beginnt das Problem. Wenn Sie dieselben Einschränkungen festlegen (oben, unten, vorne und hinten), gibt das Storyboard eine Warnmeldung aus:"Mehrdeutige scrollbare Inhaltsbreite" und "Mehrdeutige scrollbare Inhaltshöhe"
Fahren Sie mit den oben genannten Einschränkungen fort und fügen Sie die Einschränkungen
Equal Height
undEqual Width
Ihre Containeransicht in Bezug auf die Hauptansicht und nicht auf Ihre hinzuUIScrollView
. Mit anderen Worten, die Einschränkungen der Containeransicht sind an dieUIScrollView
Übersicht des Containers gebunden .Danach haben Sie keine Warnungen mehr in Ihrem Storyboard und können die Einschränkungen für Ihre Unteransichten hinzufügen.
quelle
Ich hatte das gleiche Problem. Deaktivieren Sie dieses Kontrollkästchen. Da Sie die Inhaltsgröße im Code einstellen.
quelle
Ich habe es endlich herausgefunden, ich hoffe das ist leichter zu verstehen.
Sie können diese Warnung häufig umgehen, indem Sie der Bildlaufansicht eine Basis-UIView als "Inhaltsansicht" hinzufügen, wie bereits erwähnt, und dieselbe Größe wie Ihre Bildlaufansicht festlegen und in dieser Inhaltsansicht diese 6 Parameter festlegen.
Wie Sie sehen können, benötigen Sie insgesamt 6 Parameter! Unter normalen Umständen duplizieren Sie zwei Einschränkungen, aber auf diese Weise können Sie diesen Storyboard-Fehler vermeiden.
quelle
Ich weiß, dass ich vielleicht zu spät komme, aber die nächste Lösung löst diese Art von Problemen ohne zusätzlichen Code , indem ich nur Storyboards verwende:
Für Ihre Inhaltsansicht müssen Sie Einschränkungen für führende / nachfolgende / obere / untere Bereiche für die Bildlaufansicht festlegen. Dadurch wird der Rahmen für die Inhaltsansicht nicht geändert wie :
Natürlich müssen Sie zusätzliche Einschränkungen für die Inhaltsansicht erstellen, damit die Bildlaufansicht die Inhaltsgröße kennt. Zum Beispiel feste Höhe und Mitte x einstellen.
Hoffe das hilft.
quelle
Für mich hat das Hinzufügen eines
contentView
nicht wie vorgeschlagen funktioniert. Darüber hinaus entsteht aufgrund der hinzugefügten Ansicht ein Overhead (obwohl ich dies nicht als großes Problem betrachte). Was für mich am besten funktionierte, war nur, die Mehrdeutigkeitsprüfung für meine auszuschaltenscrollView
. Alles ist gut angelegt, daher denke ich, dass es in einfachen Fällen wie meinem in Ordnung ist. Beachten SiescrollView
jedoch, dass der Interface-Builder Sie bei weiteren Einschränkungen für Ihre Unterbrechung nicht mehr davor warnt.quelle
Schauen Sie sich dieses sehr schnelle und präzise Tutorial an, wie Sie die Bildlaufansicht zum Laufen bringen und mit automatischem Layout vollständig scrollbar machen können. Das einzige, was mich immer noch verwirrt, ist, warum der Inhalt der Bildlaufansicht immer größer als nötig ist.
http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/
quelle
Siehe unten: Inhaltsansicht in vertikal und horizontal zentralisierter Bildlaufansicht. Wenn Sie einen Mehrdeutigkeitsfehler erhalten haben, stellen Sie immer sicher, dass zwei aus Ihrer Inhaltsansicht in die Bildlaufansicht eingefügte Elemente 1) .Button Space to Container.2) Trailing Space to Constraint sind, das im Screenshot hervorgehoben ist.
Diese Einschränkung bedeutet beim Scrollen, wie viel Sie nach der Höhe oder Breite Ihrer Inhaltsansicht scrollen können.
es kann dir helfen.
quelle
Ich habe diese Art von Problem für meine Ansicht gelöst, indem ich "Automatische Layoutprobleme beheben"> "Fehlende Einschränkungen hinzufügen" für die ausgewählte Ansicht verwendet habe
Die folgenden zwei Einschränkungen lösen mein Problem:
in dem: trailing, bottom sind die trailing, bottom von UIScrollView
quelle
Verwendung content (
UView
) als Behälter innenUIScrollView
, Stick Kanten (top
,bottom
,trailing
,leading
) von Super (UIScrollView
) undcontentView
sollteequalwidth
undequalheight
zu Super. Das sind Einschränkungen. Und Aufruf der Methode:Probleme für mich gelöst.
quelle
Schneller 4+ Ansatz:
1) Setzen Sie den oberen, unteren, linken und rechten Rand von UIScrollView auf 0
2) Fügen Sie in UIScrollView ein UIView hinzu und setzen Sie die oberen, unteren, führenden und nachfolgenden Ränder auf 0 (gleich den UIScrollView-Rändern).
3) Der wichtigste Teil ist das Festlegen von Breite und Höhe, wobei die Höhenbeschränkung eine niedrige Priorität haben sollte .
quelle
Die Antwort von @Matteo Gobbi ist perfekt, aber in meinem Fall kann die Bildlaufansicht nicht gescrollt werden. Ich entferne " Mitte Y ausrichten " und füge " Höhe> = 1 " hinzu. Die Bildlaufansicht wird scrollbar
quelle
Personen, die mit uiscrollview zu kämpfen haben und nicht scrollen, legen einfach die untere Einschränkung Ihrer Inhaltsansicht mit dem unteren Layout Ihrer letzten Ansicht fest (das sich innerhalb Ihrer Inhaltsansicht befindet). Vergessen Sie nicht, die mittlere Y-Einschränkung zu entfernen.
Rest alle Einschränkungen sind die gleichen wie oben definiert. In der Bildlaufansicht geht es nur darum, die maximale Höhe aus der Inhaltsansicht zu erhalten, und wir legen sie als unterste Einschränkung der letzten Ansicht fest. Dies bedeutet, dass die Bildlaufansicht automatisch den Inhaltsversatz ändert.
In meinem Fall war die letzte Ansicht UILable mit der Eigenschaft no 0 = 0 (wodurch die Höhe automatisch abhängig vom Inhalt angepasst wird), sodass die Höhe von uilable dynamisch erhöht wird und schließlich unser scrollbarer Bereich zunimmt, da das untere Layout von uilable am unteren Rand unserer Inhaltsansicht ausgerichtet ist. Dadurch wird die Bildlaufansicht gezwungen, den Inhaltsversatz zu erhöhen.
quelle
Ich habe ein Video auf youTube gemacht
Scroll StackViews erstellt, in dem nur Storyboard in Xcode verwendet wurde
Ich denke, dass hier zwei Arten von Szenarien auftreten können.
Die Ansicht in der scrollView -
UIView
)UIStackView
)Für eine vertikal scrollbare Ansicht müssen Sie in beiden Fällen die folgenden Einschränkungen hinzufügen:
4 Einschränkungen von oben, links, unten und rechts.
Gleiche Breite wie die Bildlaufansicht (um das horizontale Bildlauf zu beenden)
Sie benötigen keine weiteren Einschränkungen für Ansichten, die eine eigene Inhaltshöhe haben.
Für Ansichten ohne intrinsische Inhaltshöhe müssen Sie eine Höhenbeschränkung hinzufügen. Die Ansicht wird nur gescrollt, wenn die Höhenbeschränkung größer als die Höhe der scrollView ist.
quelle
Ausgabe:
quelle
In meinem Fall habe ich das Problem mit der falschen Inhaltsgröße und der Mehrdeutigkeit der Inhaltsgröße auf dem iPad erhalten, funktionierte jedoch im Falle des iPhone. Ich habe die folgenden Änderungen im Storyboard vorgenommen, um das Problem zu beheben.
quelle
Vertikales Scrollen
quelle
Ich habe eine separate Inhaltsansicht erstellt, wie hier gezeigt.
Die Inhaltsansicht ist Freiform und kann alle Unteransichten mit ihren eigenen Einschränkungen in Bezug auf die Inhaltsansicht hinzufügen.
Die UIScrollView wird dem Hauptansichts-Controller hinzugefügt.
Programmatisch füge ich die über IBOutlet verknüpfte contentView zur Klasse hinzu und setze die contentView von UIScrollView.
quelle
Ich habe den gleichen Fehler erhalten. Ich habe folgendes getan
Fügen Sie nun führend / nachlaufend / oben / unten für scrollView (2) und dann UIView (3) hinzu.
Wählen Sie Ansicht (1) und Ansicht (3), stellen Sie Größe und Gewicht gleichermaßen ein. Es hat mein Problem gelöst.
Ich habe das Video gemacht, das helfen wird:
https://www.youtube.com/watch?v=s-CPN3xZS1A
quelle
[getestet in XCode 7.2 und für iOS 9.2]
Was die Storyboard-Fehler und Warnungen für mich unterdrückte, war das Festlegen der Größe der Bildlaufansicht und der Inhaltsansicht (in meinem Fall einer Stapelansicht) auf Platzhalter . Diese Einstellung finden Sie im Größeninspektor im Storyboard. Und es heißt: - Das Festlegen einer intrinsischen Inhaltsgröße für die Entwurfszeit wirkt sich nur auf eine Ansicht während der Bearbeitung in Interface Builder aus. Die Ansicht hat zur Laufzeit nicht diese intrinsische Inhaltsgröße.
Ich denke, wir machen nichts falsch, wenn wir dies einstellen.
Hinweis: Im Storyboard habe ich alle Kanten der Bildlaufansicht an die Übersicht und alle Kanten der Stapelansicht an die Bildlaufansicht angeheftet. In meinem Code habe ich die translatesAutoresizingMaskIntoConstraints sowohl für die Bildlaufansicht als auch für die Stapelansicht als false festgelegt. Und ich habe keine Inhaltsgröße erwähnt. Wenn die Stapelansicht dynamisch wächst, stellen die im Storyboard festgelegten Einschränkungen sicher, dass der Stapel scrollbar ist.
Die Storyboard-Warnung machte mich verrückt und ich wollte die Dinge nicht horizontal oder vertikal zentrieren, nur um die Warnung zu unterdrücken.
quelle
Wenn jemand ein Verhalten bekommt, bei dem Sie die Bildlaufleiste auf der rechten Seite bemerken, der Inhalt sich jedoch nicht bewegt, ist diese Tatsache wahrscheinlich eine Überlegung wert:
Das ist aus Apples Dokumentation . Wenn Sie beispielsweise versehentlich Ihre oberste Beschriftung / Schaltfläche / Bild / Ansicht an die Ansicht außerhalb des Bildlaufbereichs (möglicherweise eine Kopfzeile oder etwas direkt über der Bildlaufansicht?) Anstelle der Inhaltsansicht angeheftet haben, frieren Sie Ihre gesamte Inhaltsansicht ein.
quelle
Wie in den vorherigen Antworten erwähnt, sollten Sie der Bildlaufansicht eine benutzerdefinierte Ansicht hinzufügen:
Fügen Sie der Inhaltsansicht alle Ihre Unteransichten hinzu. Irgendwann wird eine Bildlaufinhaltsansicht mit einer mehrdeutigen Warnung zur Inhaltsgröße angezeigt. Wählen Sie die Inhaltsansicht aus, klicken Sie auf die Schaltfläche "Probleme mit dem automatischen Layout beheben" (in der unteren rechten Ecke des IB-Layouts) und wählen Sie "Fehlende hinzufügen" Einschränkungen "Option.
Von nun an aktualisiert die Bildlaufansicht beim Ausführen des Projekts automatisch die Inhaltsgröße, ohne dass zusätzlicher Code erforderlich ist.
quelle
In meinem Fall - einer horizontal scrollenden Bildlaufansicht - musste ich außerdem für jedes untergeordnete Element der Bildlaufansicht Einschränkungen hinsichtlich Breite und Höhe hinzufügen, obwohl der technische Hinweis von Apple dies nicht angibt.
quelle
Setzen Sie die Größe des ViewControllers (der die UIScrollView enthält) im Größeninspektor in Interface Builder auf Freiform, und alle sollten funktionieren.
Freiformeinstellung im Größeninspektor im Interface Builder für den enthaltenen UIViewcontroller
quelle
Wenn Sie immer noch Probleme mit UIScrollView haben, schalten Sie einfach ab Inhalt - Layout Guides (Wählen Sie ein Scroll in Xcode Interface Builder -> Größe Inspektor in der rechten Panel wählen -> Auswahl aufheben 'Content - Layout Guides') Oder versuchen Sie diese Schritte: Xcode 11 scroll Ansichtslayouts - Dies kann für neue Layoutstile hilfreich sein. Funktioniert gut unter macOS 10.15.2, Xcode 11.3.1, für den 05.02.2020
siehe Screenshot
quelle
Verwenden von Autolayout
Fügen Sie Ihre Bildlaufansicht in einer genau definierten Ansicht hinzu und fügen Sie dann die Stapelansicht in der Bildlaufansicht hinzu
Fügen Sie den relevanten Superansichten Einschränkungen für oben, links, rechts, unten, Mitte X und Mitte Y aus der Bildlaufansicht und der Stapelansicht hinzu
Stellen Sie sicher, dass Einschränkungen von der Stapelansicht mit der rechtmäßigen Übersicht (Bildlaufansicht) verknüpft sind, da die aktuelle Standardeinstellung darin besteht, eine Einschränkung "Obere Ausrichtung ausrichten" und keine Einschränkung für den oberen Bereich hinzuzufügen.
quelle